1

所以我有一个相当大的源位图,所以我将它缩小了 %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

1 回答 1

1

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

(6 * 60) / 20 = 18 times slower
4 * 4         = 16 times the image size
于 2012-06-14T01:25:03.820 回答