我必须在图像处理方法中编写处理?

时间:2016-07-18 21:22:56

标签: c# .net image-processing bitmap dispose

代码在这里:

    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;
    }

我必须处理哪个位图? (我不知道是否必须处理所有这些“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”方法处理是否正确?

2 个答案:

答案 0 :(得分:0)

这适用于(或至少应该)适用于所有语言的所有事物:
当你完成使用某物或者一次性物体不会超过声明的范围时,就会调用Dispose。(参见:Proper use of the IDisposable interface

在C#中,使用rsync块会在执行完毕后自动将所有内容都置于内部。 (见:Uses of "using" in C#

在您的情况下,在using方法中,您的ScreenCaptureBitmap对象已被正确处理,因为

  • 致电Graphics
  • 后,您已完成此操作
  • 它不会继续存在于CopyFromScreen方法之外

ScreenCaptureBitmap方法中,您不会处置ResizeBitmap,因为您将其退回,并且它将继续存在于该方法之外。
RBmp方法中,您会自动处置ResizeBitmap,因为它位于RBmpG块中。

using方法中,在您使用timer1_Tick来帮助创建Pic后,您应该将其丢弃,因为您不再使用它,并且不需要超出范围方法。
Pic1方法中,您不会释放timer1_Tick,因为它已分配给pictureBox1.Image,而pictureBox1存在于方法范围之外。
但是,由于它是Pic1方法,我假设它将被重复调用,并且您应该清除(处置)tick之前的pictureBox1,前提是它存在。

答案 1 :(得分:0)

  

我是否必须处理方法的返回位图? (例如:“ScreenCaptureBmp”,“RBmp”)。

不,你没有。您可以使用API​​方法的代码(ScreenCaptureBitmap / ResizeBitmap)。

  

我是否在此代码中正确处理了图形(“图形”,“RBmpG”)?

是的,所演示的方法是正确的,但我个人更喜欢使用using方法,因为它更强大(您可以更多地了解using的好处。简而言之,它保证了处理调用并封装所有需要的检查):

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);
    }
}