这是我的代码:
Bitmap bmp = ImageManipulator.GetMyImageModified(bmp);
Bitmap tempBMP = ImageManipulator.cropImage(bmp, rect);
tempBMP = ImageManipulator.CopyToBpp(tempBMP, 1);
string bmpFilename = String.Format("File{0}.png", indexNum);
tempBMP.Save(bmpFilename, ImageFormat.Png);
现在我已经看到,对于IDisposable对象来说,最好使用using语句在不再需要它们时立即处理这些对象。 我想遵循这种做法,所以我需要一些帮助来重写上面的代码:
using (Bitmap bmp = ImageManipulator.GetMyImageModified(bmp){
Bitmap tempBMP = ImageManipulator.cropImage(bmp, rect); // bmp should be disposed after this line
tempBMP = ImageManipulator.CopyToBpp(tempBMP, 1);
string bmpFilename = String.Format("File{0}.png", indexNum);
tempBMP.Save(bmpFilename, ImageFormat.Png);
} // bmp is disposed here
这是我的第一次尝试,但它并不完美,因为 bmp 位图不再需要时不再处理,但在这个具体示例中不应强制要求它如此快速地处理。< / p>
tempBitmap 更有问题,因为我无法重新分配应该使用的using语句中的新Object的引用:
Bitmap tempBMP = ImageManipulator.cropImage(bmp, rect);
确实 tempBMP 引用在使用使用关键字包围上述行后变为 readonly 。
此外,tempBMP被保存到文件中,并且保存操作应该是异步的,然后我不知道像以下那样处置的影响:
tempBMP.Save(bmpFilename, ImageFormat.Png);
来电。
如果你可以帮助我写出更好的代码,我会全力以赴。
答案 0 :(得分:3)
using (var sourceBmp = ...)
using (var modifiedBmp = ImageManipulator.GetMyImageModified(sourceBmp))
using (var croppedBmp = ImageManipulator.cropImage(modifiedBmp, rect))
using (var finalBmp = ImageManipulator.CopyToBpp(croppedBmp, 1))
{
string bmpFilename = String.Format("File{0}.png", indexNum);
finalBmp.Save(bmpFilename, ImageFormat.Png);
}
答案 1 :(得分:1)
使用关键字只是一种便利。显式调用Dispose()仍然是可能的。在最后一个块中这样做。任意:
Bitmap bmp = ImageManipulator.GetMyImageModified(bmp);
var t = new Thread(() => {
try {
using (var croppedBmp = ImageManipulator.cropImage(bmp, rect))
using (var copiedBmp = ImageManipulator.CopyToBpp(tempBMP, 1)) {
string bmpFilename = String.Format("File{0}.png", indexNum);
copiedBmp.Save(bmpFilename, ImageFormat.Png);
}
}
catch (Exception ex) {
ReportFailure(ex);
}
finally {
bmp.Dispose();
}
});
t.Start();