Maison > développement back-end > C++ > Pourquoi l'enregistrement d'un fichier JPEG sur un MemoryStream dans GDI génère-t-il une « erreur générique » ?

Pourquoi l'enregistrement d'un fichier JPEG sur un MemoryStream dans GDI génère-t-il une « erreur générique » ?

Linda Hamilton
Libérer: 2025-01-26 15:26:09
original
848 Les gens l'ont consulté

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

Une erreur générique s'est produite lors de l'enregistrement du fichier JPEG dans le flux mémoire dans GDI

Lors de l'enregistrement d'une image JPEG dans un flux mémoire à l'aide de GDI, une exception est levée. Ce problème est particulièrement déroutant car il se produit avec les images JPEG et GIF, mais pas avec les images PNG.

Analyse des causes

La raison de cette erreur est que le flux mémoire doit rester ouvert pendant la sauvegarde de l'objet image. En effet, l'objet est créé avec un flux et les données ne sont vidées que lorsque le flux est fermé.

Solution

Pour résoudre ce problème, assurez-vous que le flux mémoire reste ouvert jusqu'à ce que l'image soit entièrement enregistrée. L'extrait de code suivant illustre l'approche correcte :

<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>
Copier après la connexion

Interprétation des messages d'erreur

Le vague message d'exception "Une erreur générique s'est produite dans GDI" déroute de nombreux développeurs. Cependant, la raison de cette ambiguïté est que l’exception n’est pas levée par GDI lui-même, mais par la couche d’interopérabilité COM du système.

Alternatives

Si vous ne pouvez pas garder le flux mémoire ouvert pendant la sauvegarde de l'image, une autre solution consiste à créer un nouveau flux mémoire à partir du flux mémoire d'origine avant de sauvegarder :

<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>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal