2010-05-18 3 views
3
public void CreateThumbnail(Image img1, Photo photo, string targetDirectoryThumbs) 
     { 
      int newWidth = 700; 
      int newHeight = 700; 
      double ratio = 0; 

      if (img1.Width > img1.Height) 
      { 
       ratio = img1.Width/(double)img1.Height; 
       newHeight = (int)(newHeight/ratio); 
      } 
      else 
      { 
       ratio = img1.Height/(double)img1.Width; 
       newWidth = (int)(newWidth/ratio); 
      } 

      Image bmp1 = img1.GetThumbnailImage(newWidth, newHeight, null, IntPtr.Zero); 
      bmp1.Save(targetDirectoryThumbs + photo.PhotoID + ".jpg"); 

      img1.Dispose(); 
      bmp1.Dispose(); 
     } 

J'ai mis 700px afin que vous puissiez avoir un meilleur aperçu du problème. Voici original image et resized un.C# Création d'une vignette (problème de faible qualité et de grande taille)

Toute bonne recommandation?

Merci,
Ile

+1

Alors que l'extension est "jpg", vous enregistrez l'image bmp1 au format PNG (par défaut). Pour avoir un Jpeg, utilisez bmp1.Save ("name", ImageFormat.Jpeg). – munissor

Répondre

5

Vous devriez trouver ma réponse à this question utile. Il inclut un échantillon pour une mise à l'échelle d'image de haute qualité en C#.

L'exemple complet dans mon autre réponse comprend comment enregistrer l'image sous forme de jpeg.

est ici le bit correspondant du code ...

/// <summary> 
    /// Resize the image to the specified width and height. 
    /// </summary> 
    /// <param name="image">The image to resize.</param> 
    /// <param name="width">The width to resize to.</param> 
    /// <param name="height">The height to resize to.</param> 
    /// <returns>The resized image.</returns> 
    public static System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, int width, int height) 
    { 
     //a holder for the result 
     Bitmap result = new Bitmap(width, height); 

     //use a graphics object to draw the resized image into the bitmap 
     using (Graphics graphics = Graphics.FromImage(result)) 
     { 
      //set the resize quality modes to high quality 
      graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; 
      graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; 
      graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; 
      //draw the image into the target bitmap 
      graphics.DrawImage(image, 0, 0, result.Width, result.Height); 
     } 

     //return the resulting bitmap 
     return result; 
    } 
+0

Ile ... L'une des parties importantes de la réponse de la Docta est: graphiques.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; Dans votre code d'origine, chaque pixel est simplement déplacé et agrandi sans tenir compte des pixels voisins .... L'interpolation, le lissage et la composition sont des éléments clés. – Rusty

+0

Comment enregistrer les vignettes sous forme de fichier? J'ai essayé result.Save (targetDirectoryThumbs + photo.PhotoID + ".jpg"); mais je reçois une image vide? Merci! –

+0

ile, jetez un oeil à la réponse à laquelle je me suis connecté, il y a une fonction appelée SaveJpeg que vous trouverez utile. –

1

Essayez de dessiner l'image originale à une autre image plus petite, et sauvegarder le résultat.

Bitmap bmp1 = new Bitmap(newWidth, newHeight); 
Graphics g = Graphics.FromImage(bmp); 
g.DrawImage(img1, 0, 0, newWidth, newHeight); 
bmp1.Save(targetDirectoryThumbs + photo.PhotoID + ".jpg", ImageFormat.Jpeg); 
+0

cela fonctionne bien ... merci munissor :) –

0

Etes-vous autorisé à utiliser des applications tierces? Si c'est le cas, vous voudrez peut-être vérifier ImageMagick pour gérer la création de vignettes. Il y a un wrapper .NET.

http://imagemagick.codeplex.com/

+0

Je suis autorisé à, mais je pense que la solution intégrée devrait faire le travail (je ne vois pas beaucoup se plaindre :)). Merci pour votre conseil! –

2

Si l'image contient une vignette, il va étirer automatiquement à la taille désirée ... qui fera ressembler à la merde (comme votre cas ;))

Straight outta MSDN ...

Si l'image contient un intégré image miniature, cette méthode récupère la miniature et de l'échelle s à la taille désirée. Si l'image ne contient pas d'image miniature incorporée , cette méthode crée une image miniature en redimensionnant l'image principale.

Dans votre cas, je vous suffit de double vérifier l'image source pour sa vignette et a obtenu cette ...

  • Windows New Miniature: Format JPEG (Offset: 830Size: 3234)
  • Miniature Type: JPEG
  • thumnail Largeur: 112
  • Vignette Hauteur: 84
+0

Merci pour l'information, je me suis toujours demandé pourquoi c'était le cas! –

0

I w rote un .dll gratuit qui le fait facilement. C'est ici si vous voulez voir la documentation .... Git Repository & Tutorial

Questions connexes