在哪里我必须写一个处理图像的方法
本文关键字:一个 处理 图像 方法 在哪里 | 更新日期: 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
,前提是它存在。