1. ホーム
  2. c#

[解決済み] GDI+ の Bitmap.Save メソッドで Generic エラーが発生した。

2023-08-05 04:47:39

質問

私は、画像のサムネイルコピーをサムネイルフォルダにアップロードして保存する作業を行っています。

以下のリンクを使っています。

http://weblogs.asp.net/markmcdonnell/archive/2008/03/09/resize-image-before-uploading-to-server.aspx

しかし

newBMP.Save(directory + "tn_" + filename);   

は、例外 "A generic error occurred in GDI+." を引き起こします。

私は、フォルダに権限を与えることを試み、また、保存時に新しい別のbmpオブジェクトを使用することを試みました。

編集してください。

    protected void ResizeAndSave(PropBannerImage objPropBannerImage)
    {
        // Create a bitmap of the content of the fileUpload control in memory
        Bitmap originalBMP = new Bitmap(fuImage.FileContent);

        // Calculate the new image dimensions
        int origWidth = originalBMP.Width;
        int origHeight = originalBMP.Height;
        int sngRatio = origWidth / origHeight;
        int thumbWidth = 100;
        int thumbHeight = thumbWidth / sngRatio;

        int bannerWidth = 100;
        int bannerHeight = bannerWidth / sngRatio;

        // Create a new bitmap which will hold the previous resized bitmap
        Bitmap thumbBMP = new Bitmap(originalBMP, thumbWidth, thumbHeight);
        Bitmap bannerBMP = new Bitmap(originalBMP, bannerWidth, bannerHeight);

        // Create a graphic based on the new bitmap
        Graphics oGraphics = Graphics.FromImage(thumbBMP);
        // Set the properties for the new graphic file
        oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

        // Draw the new graphic based on the resized bitmap
        oGraphics.DrawImage(originalBMP, 0, 0, thumbWidth, thumbHeight);

        Bitmap newBitmap = new Bitmap(thumbBMP);
        thumbBMP.Dispose();
        thumbBMP = null;

        // Save the new graphic file to the server
        newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

        oGraphics = Graphics.FromImage(bannerBMP);
        // Set the properties for the new graphic file
        oGraphics.SmoothingMode = SmoothingMode.AntiAlias; oGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic;

        // Draw the new graphic based on the resized bitmap
        oGraphics.DrawImage(originalBMP, 0, 0, bannerWidth, bannerHeight);
        // Save the new graphic file to the server
        bannerBMP.Save("~/image/" + objPropBannerImage.ImageId + ".jpg");


        // Once finished with the bitmap objects, we deallocate them.
        originalBMP.Dispose();

        bannerBMP.Dispose();
        oGraphics.Dispose();
    }

どのように解決するのですか?

<ブロッククオート

ビットマップオブジェクトまたはイメージオブジェクトのいずれかがファイルから構築される場合 ファイルから構築された場合、そのファイルはオブジェクトの有効期間中ロックされたままです。そのため その結果、画像を変更して、元のファイルと同じファイルに保存することはできません。 に保存することはできません。 http://support.microsoft.com/?id=814675

GDI+、JPEG 画像から MemoryStream への変換で一般的なエラーが発生しました。

Image.Save(...)は、メモリストリームが閉じているため、GDI+の例外を投げます。

http://alperguc.blogspot.in/2008/11/c-generic-error-occurred-in-gdi.html

EDITです。

記憶で書いているだけですが...。

中間的な'メモリストリームに保存する、それが動作するはずです。

例えば、これを試してみてください - 置き換える

    Bitmap newBitmap = new Bitmap(thumbBMP);
    thumbBMP.Dispose();
    thumbBMP = null;
    newBitmap.Save("~/image/thumbs/" + "t" + objPropBannerImage.ImageId, ImageFormat.Jpeg);

のようなもので。

string outputFileName = "...";
using (MemoryStream memory = new MemoryStream())
{
    using (FileStream fs = new FileStream(outputFileName, FileMode.Create, FileAccess.ReadWrite))
    {
        thumbBMP.Save(memory, ImageFormat.Jpeg);
        byte[] bytes = memory.ToArray();
        fs.Write(bytes, 0, bytes.Length);
    }
}