Ralat generik berlaku semasa menyimpan JPEG ke strim memori dalam GDI
Apabila menyimpan imej JPEG ke strim memori menggunakan GDI, pengecualian dilemparkan. Isu ini amat membingungkan kerana ia berlaku dengan imej JPEG dan GIF, tetapi bukan imej PNG.
Analisis Punca
Sebab ralat ini ialah aliran memori mesti kekal terbuka semasa objek imej sedang disimpan. Ini kerana objek dicipta dengan aliran dan data hanya disiram apabila aliran ditutup.
Penyelesaian
Untuk menyelesaikan isu ini, pastikan strim memori kekal terbuka sehingga imej disimpan sepenuhnya. Coretan kod berikut menunjukkan pendekatan yang betul:
<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>
Tafsiran mesej ralat
Mesej pengecualian samar-samar "Ralat generik berlaku dalam GDI" mengelirukan ramai pembangun. Walau bagaimanapun, sebab kekaburan ini adalah bahawa pengecualian tidak dibangkitkan oleh GDI sendiri, tetapi oleh lapisan interop COM sistem.
Alternatif
Jika anda tidak dapat memastikan strim memori terbuka semasa menyimpan imej, penyelesaian lain ialah mencipta strim memori baharu daripada strim memori asal sebelum menyimpan:
<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>
Atas ialah kandungan terperinci Kenapa menjimatkan JPEG ke MemoryStream dalam GDI membuang 'kesilapan generik'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!