2013-02-14 2 views
5

Outlook 2010 추가 기능을 개발하고 직렬화 된 XML 파일에서 이미지를로드하고 있습니다. 이미지가 잘로드되고 WinForm의 pictureBox 객체에 아무 문제없이 할당 할 수 있습니다.Image.Save를 사용할 때 "GDI +에서 일반적인 오류가 발생했습니다"

string filePath = Path.Combine(dirPath, item.Id + ".jpg"); 
try 
{ 
    item.Image.Save(filePath, System.Drawing.Imaging.ImageFormat.Jpeg); 
} 
catch (Exception e) 
{ 
    Debug.WriteLine("DEBUG::LoadImages()::Error attempting to create image::" + e.Message); 
} 

를하고 일반 오류가 GDI +에서 발생 얻고있다 : 나는 그러나 하드 디스크에 물리적 파일을 저장하려고하면, 목적은 내가 뭐하는 거지,

[XmlIgnore] 
public Bitmap Image 
{ 
    get { return this.templateImage; } 
    set { this.templateImage = value; } 
} 

에 저장됩니다. 폴더에 대한 쓰기 사용 권한을 확인했으며 쓰기 권한이 있습니다. 나는 여기서 무엇이 잘못되었는지 확신 할 수 없다. 또한 ImageFormat을 bmp 및 png 등으로 변경하여 변환 문제인지 확인했지만 그렇지 않습니다. 아무도 시도해 볼 것을 제안합니까?

+4

너무있다 저장하려고하는 폴더가 올바른지 확인 이 오류에 대한 여러 가지 가능한 이유 .. 매우 실망 스럽습니다. 시도 할 사항 : 1) 다른 폴더에 쓰기. 2) 파일의 크기를 확인하십시오. 너무 큰 경우 (4000x4000의 어딘가에서)이 오류가 발생합니다. 3) 파일이 사용중인 코드 (코드 포함)가 아닌지 확인하십시오. –

+0

@Simon Whitehead는 제안에 감사드립니다. 나는 C : \ temp에 부모 디렉토리에 글을 써 보았지만 작동하지 않았다. 파일 크기는 64x64 픽셀 (작음)입니다. # 3은 아직 시도하지 않은 유일한 것입니다. 나는 새로운 물체에 이미지를 복사하고 그 물체를 쓰려고 노력할 것 같다. 잠시보고됩니다. – Magnum

+0

@Simon Whitehead WORKED! 사실 내 코드가 항목을 반복하여 GDI +가 완료되면 처리 할 수없는 것처럼 보였습니다. – Magnum

답변

22

의견에 대한 답변은 Simon Whitehead에게 감사드립니다. 그는 "3) 파일이 사용중인 코드 (코드 포함)가 아닌지 확인하십시오."

그래서 내 자신의 코드가 item.Image 개체를 사용하고 GDI +가 dispose() 메서드를 호출하지 못하게하는 것이 문제였습니다. 해결책은 새 개체에 개체를 복사 한 다음 해당 개체를 사용하여 "쓰기"하는 것입니다. 다음과 같이 결과 코드는 다음과 같습니다 너무 코드 라인 같은 오류가 직면

try 
{ 
    using (Bitmap tempImage = new Bitmap(item.Image)) 
    { 
     tempImage.Save(filePath, System.Drawing.Imaging.ImageFormat.Png); 
    }  
} 
catch (Exception e) 
{ 
    Debug.WriteLine("DEBUG::LoadImages()::Error attempting to create image::" + e.Message); 
} 
+3

그래도 문제가 해결되지 않으면 * tempImage *를 삭제하여 파일의 잠금을 해제해야합니다. * using * 문을 사용하십시오. –

+0

@HansPassant 감사합니다. 귀하의 의견을 반영하도록 답변을 수정했습니다. – Magnum

+0

대단히 감사합니다! 이것이 제가 문제를 안고있는 이유입니다. using 블록에서 새로운 Bitmap 객체를 생성하면이 문제가 해결되었습니다. –

7

:

wmImg.Save(BrandImgPath,ImageFormat.Png); 

BrandImgPath = "D:/XYZ/fileName; 

찾을 원인 :

XYZ 폴더가 D에 존재하지 않았다 : 드라이브. 그래서 내 코드는 나중에이 폴더를 만들었습니다. 경로가 존재하는지 여부를 확인해야합니다.

if (Directory.Exists(@"D:/XYZ")) return; 

누군가가 코드 실수를 해결하는 데 도움이되기를 바랍니다.

2


1. 대상 폴더에 읽기/쓰기 권한이 있는지 확인하십시오 (두 번 확인하십시오!).
2. Server.MapPath를 사용하는 것이 더 좋습니다.
3. 대상 드라이브 나 폴더에 여유 공간이 있는지 확인하십시오. 4. 대부분의 경우 공유 서버에서 사용자 메모리 스트림을 사용할 수 없으므로 공급자가 사용하도록 허용해야합니다.

희망 Microsoft는 "Generic GDI + Errror"대신 자세한 예외 오류를 제공합니다.

1

이 문제가 직접 발생했는지, 폴더가 존재했는지 확인해야했는데 GDI가 무엇이 잘못되었는지 알려주지 않았을 때 좋았을 것입니다. gaffleck으로

if (Directory.Exists(directory_path)) 
{ 
image.SaveAs(directory_path + filename); 
} 

은 GDI +가 더 많은 정보를 예외를 던진 경우에 좋을 것이라고 말했다 : 내 경우

0

는 내가 이미지를 저장 한 디렉토리 경로에서 맞춤법 실수였다.

0

동일한 일반 예외가 있지만 병렬 plesk 파일 관리자에서 IIS에 대한 쓰기 권한을 부여했습니다.당신이 윈도우 서버에있는 경우, 내 서버에 IIS_IUSR이었다 IIS 사용자에게 쓰기 권한을 부여해야합니다

또한

위의 댓글에서 언급 한 바와 같이

관련 문제