GDI에서 JPEG를 메모리 스트림에 저장할 때 일반 오류가 발생했습니다.
GDI를 사용하여 JPEG 이미지를 메모리 스트림에 저장할 때 예외가 발생합니다. 이 문제는 JPEG 및 GIF 이미지에서는 발생하지만 PNG 이미지에서는 발생하지 않기 때문에 특히 수수께끼입니다.
원인 분석
이 오류가 발생하는 이유는 이미지 개체가 저장되는 동안 메모리 스트림이 열려 있어야 하기 때문입니다. 이는 개체가 스트림을 사용하여 생성되고 스트림이 닫힐 때만 데이터가 플러시되기 때문입니다.
솔루션
이 문제를 해결하려면 이미지가 완전히 저장될 때까지 메모리 스트림이 열려 있는지 확인하세요. 다음 코드 조각은 올바른 접근 방식을 보여줍니다.
<code class="language-csharp">using (var ms = new MemoryStream()) { using (Image image = new Bitmap(...)) { ImageFormat format; switch (image.RawFormat) // 使用 RawFormat 代替 MimeType() { case ImageFormat.Png: format = ImageFormat.Png; break; case ImageFormat.Gif: format = ImageFormat.Gif; break; default: format = ImageFormat.Jpeg; break; } image.Save(ms, format); return ms.ToArray(); } }</code>
오류 메시지 해석
"GDI에서 일반 오류가 발생했습니다"라는 모호한 예외 메시지는 많은 개발자를 혼란스럽게 합니다. 그러나 이러한 모호함의 이유는 예외가 GDI 자체에서 발생하는 것이 아니라 시스템 COM 상호 운용성 계층에서 발생하기 때문입니다.
대안
이미지 저장 중에 메모리 스트림을 열어둘 수 없는 경우, 또 다른 해결책은 저장하기 전에 원래 메모리 스트림에서 새 메모리 스트림을 생성하는 것입니다.
<code class="language-csharp"> using (var ms = new MemoryStream()) { // ... using (var newMs = new MemoryStream(ms.ToArray())) { image.Save(newMs, format); return newMs.ToArray(); } } ``` 该方法效率较低,应优先考虑第一种方法。 代码中也修正了使用 `RawFormat` 属性代替 `MimeType()` 方法,因为 `MimeType()` 方法在某些情况下可能无法正确返回图像格式。</code>
위 내용은 GDI에서 JPEG를 메모리 스트림에 저장하는 이유는 '일반적인 오류'를 던지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!