2016-07-18 6 views
0

код здесь:Где я должен писать в методе обработки изображений?

public Bitmap ScreenCaptureBitmap(int DesktopX, int DesktopY, int CaptureWidth, int CaptureHeight) 
    { 
     Bitmap ScreenCaptureBmp = new Bitmap(CaptureWidth, CaptureHeight); 
     Graphics graphics = Graphics.FromImage(ScreenCaptureBmp as Image); 
     graphics.CopyFromScreen(DesktopX, DesktopY, 0, 0, ScreenCaptureBmp.Size); 
     graphics.Dispose(); 
     return ScreenCaptureBmp; 
    } 

    public Bitmap ResizeBitmap(Bitmap ResizeBmp, int RBmpWidth, int RBmpHeight) 
    { 
     Bitmap RBmp = new Bitmap(RBmpWidth, RBmpHeight); 
     using (Graphics RBmpG = Graphics.FromImage((Image)RBmp)) 
      RBmpG.DrawImage(ResizeBmp, 0, 0, RBmpWidth, RBmpHeight); 
     return RBmp; 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     Bitmap Pic = ScreenCaptureBitmap(50, 50, 640, 320); 
     Bitmap Pic1 = ResizeBitmap(Pic, 128, 64); 
     pictureBox1.Image = Pic1; 
    } 

Какой Bitmap я должен распоряжаться? (Я не знаю, должен ли я использовать все эти «ScreenCaptureBmp», «ResizeBmp», «RBmp», «Pic», «Pic1» или некоторые из них).

Должен ли я использовать обратный растровый метод? (Пример: «ScreenCaptureBmp», «RBmp»).

Я правильно выбрал графику («графика», «RBmpG») в этом коде?

ГДЕ Я НАПИСАЛ УТИЛИЗИРОВАТЬ УТИЛИЗАЦИЮ В ПРАВИЛЬНОМ ПУТЕМ?

Если я пишу этот код:

public Bitmap ScreenCaptureBitmap(int DesktopX, int DesktopY, int CaptureWidth, int CaptureHeight) 
    { 
     Bitmap ScreenCaptureBmp = new Bitmap(CaptureWidth, CaptureHeight); 
     using (Graphics graphics = Graphics.FromImage(ScreenCaptureBmp as Image)) 
      graphics.CopyFromScreen(DesktopX, DesktopY, 0, 0, ScreenCaptureBmp.Size); 
     return ScreenCaptureBmp; 
    } 

    public Bitmap ResizeBitmap(Bitmap ResizeBmp, int RBmpWidth, int RBmpHeight) 
    { 
     Bitmap RBmp = new Bitmap(RBmpWidth, RBmpHeight); 
     using (Graphics RBmpG = Graphics.FromImage((Image)RBmp)) 
      RBmpG.DrawImage(ResizeBmp, 0, 0, RBmpWidth, RBmpHeight); 
     return RBmp; 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     Bitmap Pic = ScreenCaptureBitmap(50, 50, 640, 320); 
     Bitmap Pic1 = ResizeBitmap(Pic, 128, 64); 
     Pic.Dispose(); 
      using (Image PreviewImage = pictureBox1.Image) 
      { 
       pictureBox1.Image = Pic1; 
      } 
    } 

ли все отчуждать в правильном пути в этом (2) код?

Устраняет метод «timer1_Tick» в этом (втором) коде?

+0

Используйте блок 'using', и все будет хорошо. Ни один из методов не может избавиться от растрового изображения, которое они создали, если потребительский код будет использовать их. Этот код должен, если создаются/используются новые изображения – Plutonix

+0

Можете ли вы написать пример метода? Я попытался написать «using», но я не могу писать успешно, поэтому мое приложение вылетает после начала отладки (когда я использую свой метод). Я новичок. –

+0

Для изображений, используемых в пользовательском интерфейсе, это всегда немного беспокоит ... вам нужно следить за тем, используются ли они где-либо еще. – Nyerguds

ответ

0

Должен ли я использовать возврат растрового изображения метода? (Пример: «ScreenCaptureBmp», «RBmp»).

Нет, не было. Все в порядке с кодом ваших методов API (ScreenCaptureBitmap/ResizeBitmap).

Я правильно выбрал графику («графика», «RBmpG») в этом коде?

Да, продемонстрированные подходы правильны, но я лично предпочел использовать using подход, поскольку он более надежный (вы можете Google больше о using преимуществ. Короче говоря, это гарантировано Dispose вызов и инкапсулировать все необходимые проверки):

public Bitmap ScreenCaptureBitmap(int DesktopX, int DesktopY, int CaptureWidth, int CaptureHeight) 
{ 
    Bitmap ScreenCaptureBmp = new Bitmap(CaptureWidth, CaptureHeight); 
    using(var graphics = Graphics.FromImage(ScreenCaptureBmp)) 
     graphics.CopyFromScreen(DesktopX, DesktopY, 0, 0, ScreenCaptureBmp.Size); 
    return ScreenCaptureBmp; 
} 

Но вы не в порядке с этим использованием API. Правильная версия должна выглядеть так:

void timer1_Tick(object sender, EventArgs e) 
{ 
    using(Bitmap Pic = ScreenCaptureBitmap(50, 50, 640, 320)) { 
     Image oldImage = pictureBox1.Image; 
     using(oldImage) 
      pictureBox1.Image = ResizeBitmap(Pic, 128, 64); 
    } 
} 
+0

Так что мне не нужно беспокоиться об утилизации «ScreenCaptureBmp», «RBmp» и использовать другие растровые изображения, за исключением этих двух прав? Код Вы пишете, там есть «Pic», «oldImage» и pictureBox1 предыдущее изображение удаляется автоматически? (Я хочу захватить экран, изменить его, а затем показать его в pictureBox1 и, наконец, уничтожить все, что требуется для утилизации). Если я не распоряжаюсь, делает ли мое приложение больше бара непрерывно с учетом времени? –

+0

Как я уже говорил, вы правы с реализацией ScreenCaptureBmp/ResizeBitmap. В моем коде все выбытия выполняются, когда конкретная переменная покидает соответствующий блок 'using'. Таким образом, только один образ жив в каждый момент времени. И все временные объекты (изображения/графика) расположены. – DmitryG

+0

Есть ли разница между «Графическая графика» и «var graphics»? –

0

Это относится (или, по крайней мере, предполагается) для всех вещей во всех языках:
Dispose предназначен называться, когда вы закончите использовать что-то или, если располагаемый объект не будет жить мимо рамки это было заявлено в. (См .: Proper use of the IDisposable interface)

В C# с использованием блока using автоматически размещается все внутри, когда оно завершено. (См: Uses of "using" in C#)

В вашем случае, в методе ScreenCaptureBitmap ваш объект Graphics утилизируется должным образом, потому что

  • Вы закончили с ним после того, как вы назвали CopyFromScreen
  • Он не будет продолжать жить вне метода ScreenCaptureBitmap

В вашем методе ResizeBitmap, вы не располагаете RBmp becaus e вы возвращаете его, и он будет продолжать жить вне метода.
В вашем методе ResizeBitmap вы автоматически удаляете свой RBmpG, поскольку он находится в блоке using.

В вашем методе timer1_Tick, после того, как вы используете Pic, чтобы помочь создать Pic1, вы должны утилизировать его, как вы больше не используете его, и не нужно будет жить мимо рамки метода.
В вашем методе timer1_Tick вы не распоряжаетесь Pic1, потому что ему назначено pictureBox1.Image, а pictureBox1 существует вне области действия метода.
Однако, поскольку это метод tick, я предполагаю, что он будет вызываться повторно, и вы должны очистить (удалить) pictureBox1 в предыдущих Image при условии, что он существует.