在哪里我必须写一个处理图像的方法

本文关键字:一个 处理 图像 方法 在哪里 | 更新日期: 2023-09-27 17:57:28

代码在这里:

    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"answers"RBmp","Pic"、"Pic1"或其中一些)。

我必须处理一个方法的返回位图吗?(例如:"ScreenCaptureBmp"、"RBmp")。

我在这段代码中以正确的方式处理图形("图形"、"RBmpG")了吗?

在哪里我必须写DISPOSE以正确的方式处理?

如果我写这个代码:

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

这个(第二个)代码中的所有内容都以正确的方式处理了吗?

在这个(第二个)代码中,以"timer1_Tick"方法处理是否正确?

在哪里我必须写一个处理图像的方法

我必须处理一个方法的返回位图吗?(例如:"ScreenCaptureBmp"、"RBmp")。

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

我在这段代码中以正确的方式处理图形("图形"、"RBmpG")了吗?

是的,演示的方法是正确的,但我个人更喜欢使用using方法,因为它更健壮(你可以在谷歌上搜索更多关于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);
    }
}

这适用于(或者至少应该适用于)所有语言中的所有内容:
Dispose是指当您使用完某个东西时,或者如果一次性对象将不会超过其声明的范围,则调用它。(请参阅:IDisposable接口的正确使用)

在C#中,使用using块会在执行完成后自动处理内部的所有内容。(参见:C#中"使用"的用法)

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

  • 你打电话给CopyFromScreen后就完成了
  • 它不会继续生活在ScreenCaptureBitmap方法之外

在您的ResizeBitmap方法中,您不会处理RBmp,因为您正在返回它,并且它将继续存在于该方法之外
ResizeBitmap方法中,由于RBmpG位于using块中,因此会自动处理它。

timer1_Tick方法中,在使用Pic帮助创建Pic1之后,您应该将其处理掉,因为您不再使用它,它也不需要超过该方法的范围
timer1_Tick方法中,不处置Pic1,因为它已分配给pictureBox1.Image,而pictureBox1存在于该方法的范围之外
但是,由于它是一个tick方法,我认为它将被重复调用,并且您应该清理(处置)pictureBox1以前的Image,前提是它存在。