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秒で終了しますが、何らかの理由で2番目のバージョンは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 に答える