Question

Je vais avoir un diable de temps avec la création de vignettes, puis les convertir en un tableau d'octets. J'ai essayé trois méthodes, et les 3 fois où je reçois une erreur.

La première utilisait Bitmap.GetThumbnailImage, que je l'ai utilisé dans le passé et puis enregistré directement dans Response.OutputStream

La seconde utilisait System.Drawing.Graphics avec DrawImage (). Toujours pas aller.

Le troisième était juste pour créer une nouvelle image, passez dans l'ancien bitmap, et définissez la nouvelle taille. même erreur.

  

La valeur ne peut être nulle.
  Nom du paramètre: encodeur
  Description: Une exception non gérée produite lors de l'exécution de la demande Web actuelle. S'il vous plaît examiner la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
  Détails de l'exception: System.ArgumentNullException: La valeur ne peut être nulle
.   Nom du paramètre: encodeur
  Erreur source:
  Une exception non gérée a été générée pendant l'exécution de la demande Web en cours. Les informations concernant l'origine et l'emplacement de l'exception peut être identifiée à l'aide de la pile d'exception trace ci-dessous.
  Trace de la pile:
  [ArgumentNullException: La valeur ne peut être nulle
.   Nom du paramètre: encodeur]
     System.Drawing.Image.Save (stream Stream, codeur ImageCodecInfo, EncoderParameters encoderParams) 615244

Voici le code de ma méthode. Peut-être que quelqu'un va voir ce que je fais mal. Si vous n'êtes pas sûr de GetThumbSize, il est tout simplement une méthode qui prend de la taille de l'image et la taille du pouce maximum et calcule alors une taille réelle pour conserver le rapport d'aspect.

public static System.Drawing.Image.GetThumbnailImageAbort thumbnailCallback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);

    public static bool ThumbnailCallback()
    {
        return false;
    }

    /// <summary>
    /// 
    /// </summary>
    /// <param name="image"></param>
    /// <param name="size"></param>
    /// <remarks>
    /// This method will throw a AccessViolationException when the machine OS running the server code is windows 7.
    /// </remarks>
    /// <returns></returns>
    public static byte[] CreateThumbnail(byte[] imageData, Size size)
    {
        using (MemoryStream inStream = new MemoryStream())
        {
            inStream.Write(imageData, 0, imageData.Length);

            using (System.Drawing.Image image = Bitmap.FromStream(inStream))
            {
                Size thumbSize = GetThumbSize(new Size(image.Width, image.Height), size);

                //do not make image bigger
                if (thumbSize.Equals(image.Size) || (image.Width < size.Width || image.Height < size.Height))
                {
                    //if no shrinking is ocurring, return the original bytes
                    return imageData;
                }
                else
                {
                    using (System.Drawing.Image thumb = image.GetThumbnailImage(thumbSize.Width, thumbSize.Height, thumbnailCallback, IntPtr.Zero))
                    {

                        using (MemoryStream outStream = new MemoryStream())
                        {
                            thumb.Save(outStream, thumb.RawFormat);

                            return outStream.ToArray();
                        }
                    }
                }
            }
        }

    }

Cette ligne est de lancer l'erreur:

thumb.Save(outStream, thumb.RawFormat);

Toutes les idées? Merci pour l'aide!

Était-ce utile?

La solution

Je pense que le problème peut être l'encodage de l'image originale. IIRC, Save (flux, le format) se traduit par un appel pour sauver (flux, encodeur, params), le codeur étant pris du format; qui dans votre cas est le format original de l'image.

Selon le Contenu de la communauté pour la méthode Save , certains formats ne se traduira pas bien dans un codeur approprié.

Je vous suggère de spécifier l'encodeur vous-même, en utilisant un format standard comme PNG.

Essayez:

thumb.Save(outStream, ImageFormat.Png, null); // optionally add encoder parameters here, like quality or luminescence

Autres conseils

Si ce que vous essayez de faire est l'enregistrer dans un format Raw, vous pouvez essayer ce qui suit, comme dans mon cas, il fonctionne lorsque le format d'image d'origine est une prise en charge:

try
{
   thumb.Save(outStream, img.RawFormat);
}
catch (System.ArgumentNullException)
{
   thumb.Save(outStream, ImageFormat.Png);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top