2011-08-18 45 views
19

tôi nạp hình ảnh vào Box Hình ảnh sử dụng:Một lỗi chung xảy ra trong GDI +

picturebox1.Image = Image.FromFile() 

và tôi lưu nó bằng cách sử dụng:

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

Nó hoạt động hoàn toàn tốt đẹp khi tạo một tập tin mới, nhưng khi tôi cố gắng thay thế hình ảnh hiện tại, tôi bị ném lỗi thời gian chạy sau:

A generic error occurred in GDI+

Vì vậy, tôi có thể làm gì để giải quyết vấn đề này??

Trả lời

15

Đó bởi vì các tập tin hình ảnh được sử dụng bởi picturebox1.Image của bạn, hãy thử để lưu nó vào đường dẫn tập tin khác nhau thay vì:

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

Edit: Bạn cũng có thể thêm một bản sao từ hình ảnh ở nơi đầu tiên như :

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

Cảm ơn. Nếu tôi muốn thay thế, tôi không thể làm điều đó? – Lakshani

+0

Nếu bạn muốn thay thế, trước tiên bạn nên xóa hình ảnh khỏi 'pictureBox.Image' rồi thay thế rồi thêm lại vào' pictureBox.Image', bạn cũng có thể thêm bản sao hình ảnh của mình vào hộp hình ảnh tại địa điểm đầu tiên ... –

+0

@ Lakshani: đừng quên đánh dấu câu trả lời để trả lời câu hỏi của bạn đúng như [câu trả lời được chấp nhận] (http://meta.stackexchange.com/questions/5234/how-does-accepting- an-answer-work/5235 # 5235) để người khác biết cách giải quyết vấn đề của bạn. –

1

dùng thử.

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

Trong mã này, vấn đề đó xảy ra. – Lakshani

+0

bạn phải xác định openfiledialog trước tiên. hơn là đọc hình ảnh từ tệp và sử dụng các mã này. nó sẽ giúp bạn. – TheMuyu

6

Phương pháp FromFile khóa tập tin, vì vậy sử dụng Image.FromStream() phương pháp đọc hình ảnh:

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

Sau đó lưu như bạn đã hết.

+0

Tôi nghĩ điều này có thể đã khắc phục được sự cố mà tôi đã trải qua hàng tháng trời! – ScruffyDuck

+0

Tất nhiên! @ScruffyDuck, phương thức ** Image.FromFile ** sẽ mở tệp hình ảnh đó. – adatapost

+0

@Jon nut không có phương pháp tiết kiệm? – Lakshani

4

Điều này cũng có thể xảy ra nếu đường dẫn không tồn tại.

Bạn có thể tạo các thư mục với:

System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(FileName)); 
1

Khi một trong hai đối tượng Bitmap hoặc một đối tượng hình ảnh được xây dựng từ một tập tin, tập tin vẫn bị khóa cho các đời của đối tượng. Kết quả là, bạn không thể thay đổi một hình ảnh và lưu nó trở lại cùng một tệp nơi nó bắt nguồn. xảy ra http://support.microsoft.com/?id=814675

Một lỗi chung trong GDI +, Hình ảnh JPEG để 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: Chỉ cần viết từ bộ nhớ. Tiết kiệm đến một 'trung gian' MemoryStream nên làm việc:

Ví dụ, thay thế này:

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

với một cái gì đó như:

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); 
    } 
} 
0

Cũng giống như @Jalal Aldeen Saa'd nói, hình ảnh hộp đang sử dụng tệp và bị khóa khỏi tệp thay thế.

//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

thử này nó sẽ làm việc

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

nó cũng sẽ giải quyết lỗi của gdi + –

0

này cũng có thể xảy ra nếu bạn quên thêm filename:

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

Và có thể được cố định bằng cách thêm tên file:

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

Lưu ý: Bạn không thực sự phải thêm tiện ích mở rộng để tiện ích đó hoạt động.

0

Hãy thử điều này:

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; 
     } 
    } 

} 
Các vấn đề liên quan