如何快速批量保存位图

本文关键字:保存 位图 何快速 | 更新日期: 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