代码在这里:
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”方法处理是否正确?
答案 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);
}
}