Créer une miniature, puis convertir en tableau d'octets
-
23-08-2019 - |
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!
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);
}