如何快速批量保存位图?

时间:2012-06-13 22:42:09

标签: c# .net bitmap system.drawing

所以我有一个相当大的源位图,所以我将它缩小了%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,但没有任何帮助。是否有某种引人注目的东西,我应该注意到这是导致这种情况?

1 个答案:

答案 0 :(得分:1)

原始方法以原始分辨率保存文件,而新方法将宽度和高度增加4倍,这是图像大小增加16倍。时差(6分钟vs 20秒)大致成比例:

(6 * 60) / 20 = 18 times slower
4 * 4         = 16 times the image size