web-dev-qa-db-ja.com

GDI +で一般的なエラーが発生しました

私は画像ボックスに画像をロードしました:

picturebox1.Image = Image.FromFile()

そして私はそれを使ってそれを保存します:

Bitmap bm = new Bitmap(pictureBox1.Image);
bm.Save(FileName, ImageFormat.Bmp);

新しいファイルを作成するときは問題なく動作しますが、既存のイメージを置き換えようとすると、次のランタイムエラーがスローされます。

GDI +で一般的なエラーが発生しました

この問題を解決するにはどうすればよいですか?

20
Lakshani

これは、画像ファイルがpicturebox1.Image、代わりに別のファイルパスに保存してみてください。

picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(@"New File Name", ImageFormat.Bmp);

編集:次のように、最初に画像からコピーを追加することもできます。

picturebox1.Image = new Bitmap(Image.FromFile(FileName));
Bitmap bm = new Bitmap(pictureBox1.Image); 
bm.Save(FileName, ImageFormat.Bmp);//no error will occurs here.
15
Jalal Said

FromFileメソッドはファイルをロックするため、イメージの読み取りにはImage.FromStream()メソッドを使用します。

byte[] bytes = System.IO.File.ReadAllBytes(filename);
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes);
pictureBox1.Image = Image.FromStream(ms);

次に、以前と同じように保存します。

6
adatapost

これは、パスが存在しない場合にも発生する可能性があります。

次のコマンドでディレクトリを作成できます。

System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName));
4
weston

BitmapオブジェクトまたはImageオブジェクトのいずれかがファイルから構成される場合、ファイルはオブジェクトの存続期間中ロックされたままになります。その結果、画像を変更して元のファイルに保存することはできません。 http://support.Microsoft.com/?id=814675

GDI +、JPEG Image to MemoryStreamで一般的なエラーが発生しました:

Image.Save(..)  // throws a GDI+ exception because the memory stream is closed

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

EDIT:メモリから書き込むだけです。 「中間」MemoryStreamへの保存は機能するはずです。

たとえば、これを置き換えます。

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);
    }
}
2
Mou

これを試して。

picturebox1.Image = Image.FromFile(FileName);
Bitmap bm = new Bitmat(pictureBox1.Image); 
Image img = (Image)b;
img.Save(FileName, ImageFormat.Bmp);
1
TheMuyu

これを試して:

private void LoadPictureBoxWithImage( string ImagePath)
{
    Stream objInputImageStream = null;
    BitmapData bmdImageData = null;
    Bitmap bmpSrcImage = null, bmTemp = null;
    byte[] arrImageBytes = null;
    int bppModifier = 3;
    try
    {

        objInputImageStream = new MemoryStream();
        using (FileStream objFile = new FileStream(ImagePath, FileMode.Open, FileAccess.Read))
        {
            objFile.CopyTo(objInputImageStream);
        }

        bmpSrcImage = new Bitmap(objInputImageStream);
        bppModifier = bmpSrcImage.PixelFormat == PixelFormat.Format24bppRgb ? 3 : 4;

        //reda from byte[] to bitmap               
        bmdImageData = bmpSrcImage.LockBits(new Rectangle(0, 0, bmpSrcImage.Width, bmpSrcImage.Height), ImageLockMode.ReadOnly, bmpSrcImage.PixelFormat);
        arrImageBytes = new byte[Math.Abs(bmdImageData.Stride) * bmpSrcImage.Height];

        System.Runtime.InteropServices.Marshal.Copy(bmdImageData.Scan0, arrImageBytes, 0, arrImageBytes.Length);
        bmpSrcImage.UnlockBits(bmdImageData);

        pbSetup.Image = (Bitmap)bmpSrcImage.Clone();
        pbSetup.Refresh();

    }
    catch (Exception ex)
    {
        throw new Exception("Error in Function " + System.Reflection.MethodInfo.GetCurrentMethod().Name + "; " + ex.Message);
    }
    finally
    {
        if (objInputImageStream != null)
        {
            objInputImageStream.Dispose();
            objInputImageStream = null;
        }
        if (bmdImageData != null)
        {
            bmdImageData = null;
        }
        if (bmpSrcImage != null)
        {
            bmpSrcImage.Dispose();
            bmpSrcImage = null;
        }
        if (bmTemp != null)
        {
            bmTemp.Dispose();
            bmTemp = null;
        }
        if (arrImageBytes != null)
        {
            arrImageBytes = null;
        }
    }

}
0
Kalpana

@Jalal Aldeen Saaが言ったように、画像ボックスはファイルを使用しており、ファイル置換からロックされています。

//unlock file by clearing it from picture box
if (picturebox1.Image != null)
{
   picturebox1.Image.Dispose();
   picturebox1.Image = null;
}

//put back the picture inside the pictureBox?
0
V-SHY

これは、ファイル名を追加し忘れた場合にも発生する可能性があります。

bm.Save(@"C:\Temp\Download", System.Drawing.Imaging.ImageFormat.Png);

そして、ファイル名を追加することで修正できます:

bm.Save(@"C:\Temp\Download\Image.png", System.Drawing.Imaging.ImageFormat.Png);

注:実際に機能させるために、拡張子を追加する必要はありません。

0
AzzamAziz

Image.Clone()で作成された画像でも、以下のBADコードに示すようにGDI +エラーが発生することに注意してください。このページのソリューションに示すように、画像を読み取るにはImage.FromStream()メソッドを使用する必要があります。


    //BAD CODE: the image we will try to save AFTER the original image has been cloned and disposed
    Image clonedImage;
    //load image from file, clone it then dispose
    using (var loadedFromDiskImage = Image.FromFile(filePath))
    {
         clonedImage = (Image) loadedFromDiskImage.Clone();
    } 

//you might think the new image can be saved given the original is disposed
 //but this doesn't seem to be the way Clone() works
 //expect GDI+ error in line below:
 clonedImage.Save(filePath);
</ code>

0
yodag123

これを試してみてください

public void SavePicture()
{
     Bitmap bm = new Bitmap(this.myBitmap)
     bm.Save("Output\\out.bmp" ,System.Drawing.Imaging.ImageFormat.Bmp );
}
0
Saurabh Solanki

一般的なエラーがGDI +で発生しました

私も同じ問題に直面しました。私はこの問題を修正するために非常に多くの方法を試しました。最後に、私は間違っている場所を見つけました。問題は、ファイルパスにスペースを使用したことです。これは許容できません。今、アポストロフィの後のCの前のスペースを削除した後、それは正常に動作しています:

"SupplyItems":"C:\\inetpub\\HIBMS_Ver1\\BarcodeImages\\Supply\\"

代わりに...以下を使用しました。

"SupplyItems":" C:\\inetpub\\HIBMS_Ver1\\BarcodeImages\\Supply\\"

小さな間違いですが、見つけて修正するのに長い時間がかかりました。

0
Sinchana