如何快速批量保存位图
本文关键字:保存 位图 何快速 | 更新日期: 2023-09-27 18:37:10
所以我有一个相当大的源位图,所以我将其缩小了 %25 的比例,以加快图像处理的速度。最后,我有一组矩形(大约 2000 年),它们对应于缩放图像的各个部分。我正在尝试重新缩放矩形以匹配源上的相同区域,然后将该区域另存为裁剪图像。
这是我保存缩放图像裁剪图像的初始代码:
for (int i = 0; i < cells.Count; i++)
{
for (int j = 0; j < cells[i].Count; j++)
{
Cell cell = cells[i][j];
if (cell.width < 0 || cell.height < 0)
{
return;
}
Bitmap bitmap = new Bitmap(cell.width, cell.height);
using (Graphics c = Graphics.FromImage(bitmap))
{
c.DrawImage(inputBitmap, new Rectangle(0, 0, cell.width, cell.height), new Rectangle(cell.x1, cell.y1, cell.width, cell.height), GraphicsUnit.Pixel);
}
bitmap.Save(cellDirectory + "''cell" + i.ToString("D2") + j.ToString("D2") + ".png", ImageFormat.Png);
}
}
这是我为保存原始位图的裁剪图像而更改的代码:
for (int i = 0; i < cells.Count; i++)
{
for (int j = 0; j < cells[i].Count; j++)
{
Cell cell = cells[i][j];
if (cell.width < 0 || cell.height < 0)
{
return;
}
int x = cell.x1 * 4;
int y = cell.y1 * 4;
int width = cell.width * 4;
int height = cell.height * 4;
Bitmap bitmap = new Bitmap(width, height);
using (Graphics c = Graphics.FromImage(bitmap))
{
c.DrawImage(input, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
}
bitmap.Save(cellDirectory + "''cell" + i.ToString("D2") + j.ToString("D2") + ".png", ImageFormat.Png);
}
}
具有第一个代码的程序平均在大约 20 秒内完成,但由于某种原因,第二个版本需要 6 分钟以上。我的大脑数学可能对我撒谎,但这似乎是一个不成比例的时间增加。
到目前为止,我所做的调试向我揭示了这一行:
c.DrawImage(input, new Rectangle(0, 0, width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
随着时间的推移,需要更长的时间才能完成。我怀疑某种内存泄漏可能导致这种情况,但我尝试在每个对象上手动调用 Dispose 并且没有任何帮助。有没有某种我应该意识到的底层事情导致了这种情况?
原始方法以原始分辨率保存文件,而新方法将宽度和高度都增加了 4 倍,即图像大小增加了 16 倍。时差(6 分钟与 20 秒)大致成正比:
(6 * 60) / 20 = 18 times slower
4 * 4 = 16 times the image size