3

大まかなサイズ変更作業を行う必要がある画像がいくつかあります。この例では、特定の画像の幅と高さを 4 ピクセル増やす必要があるとだけ言っておきましょう。Graphics.DrawImage() への呼び出しが OOM をスローしている理由がわかりません。ここでアドバイスをいただければ幸いです。

class Program
{
    static void Main(string[] args)
    {
        string filename = @"c:\testImage.png";

        // Load png from stream
        FileStream fs = new FileStream(filename, FileMode.Open);
        Image pngImage = Image.FromStream(fs);
        fs.Close();

        // super-hacky resize
        Graphics g = Graphics.FromImage(pngImage);
        g.DrawImage(pngImage, 0, 0, pngImage.Width + 4, pngImage.Height + 4); // <--- out of memory exception?!

        // save it out
        pngImage.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
    }
}
4

4 に答える 4

4

私はちょうど同じ問題を抱えていました。ただし、出力グラフィックスのサイズを修正しても問題は解決しませんでした。多くの画像でコードを使用するとメモリを消費しすぎる画像の描画に非常に高い品質を使用しようとしたことに気付きました。

g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;

これらの行をコメントアウトした後、コードは完全に機能しました。

于 2014-12-26T23:17:34.200 に答える
2

Graphics サーフェスは、元のサイズの画像に対して十分な大きさしかありません。正しいサイズの新しい画像を作成し、それを Graphics オブジェクトのソースとして使用する必要があります。

Image newImage = new Bitmap(pngImage.Width + 4, pngImage.Height+4);
Graphics g = Graphics.FromImage(newImage);
于 2013-03-15T17:27:25.343 に答える
1

画像が で指定されたものと同じサイズであるため、やりたいことを達成できない可能性がありますFromImage。代わりに、次のBitmapクラスを使用できます。

using (var bmp = new Bitmap(fileName))
{
    using (var output = new Bitmap(
        bmp.Width + 4, bmp.Height + 4, bmp.PixelFormat))
    using (var g = Graphics.FromImage(output))
    {
        g.DrawImage(bmp, 0, 0, output.Width, output.Height);

        output.Save(outFileName, ImageFormat.Png);
    }
}
于 2013-03-15T17:31:38.880 に答える
0

この修正を試すことができますか?

    class Program
    {
        static void Main(string[] args)
        {
            string filename = @"c:\testImage.png";

            // Load png from stream
            FileStream fs = new FileStream(filename, FileMode.Open);
            Image pngImage = Image.FromStream(fs);
            fs.Close();

            // super-hacky resize
            Graphics g = Graphics.FromImage(pngImage);
            pngImage = pngImage.GetThumbnailImage(image.Width, image.Height, null, IntPtr.Zero);
            g.DrawImage(pngImage, 0, 0, pngImage.Width + 4, pngImage.Height + 4); // <--- out of memory exception?!

            // save it out
            pngImage.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
        }
    }

この質問に触発されました:DrawImageを呼び出すときの「メモリ不足」例外を解決するのに役立ちます

于 2013-03-15T17:28:40.410 に答える