Rumah > pembangunan bahagian belakang > C++ > Kenapa menjimatkan JPEG ke MemoryStream dalam GDI membuang 'kesilapan generik'?

Kenapa menjimatkan JPEG ke MemoryStream dalam GDI membuang 'kesilapan generik'?

Linda Hamilton
Lepaskan: 2025-01-26 15:26:09
asal
848 orang telah melayarinya

Why Does Saving a JPEG to a MemoryStream in GDI  Throw a

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan