2009-10-13 7 views
0

J'ai un problème avec le contrôle ListView dans une application Windows Forms. Même si je crée une image miniature ou redimensionne la vraie, je reçois des images déformées dans la liste. L'image apparaît lorsque vous effectuez un zoom avant sur une image. J'ai d'abord pensé que le GetThumbnailImage le cachait mais j'ai utilisé un code de redimensionnement que j'ai trouvé ici et j'ai le même résultat.Contrôle de vue liste affichant des images déformées

Je n'ai pas non plus trouvé de bug lié au contrôle de la liste, donc je pense que je fais quelque chose de mal mais je n'arrive pas à comprendre quoi. Voici le code que j'utilise:

lsvPictures.LargeImageList = m_imagesList; 
lsvPictures.LargeImageList.ImageSize = new Size(100, 100); 
lsvPictures.View = View.LargeIcon; 
lsvPictures.CheckBoxes = true; 
for (int i = 0; i < ofd.FileNames.Length; i++) 
{ 
    filename = ofd.FileNames[i].ToString();  
    ListViewItem lvi = new ListViewItem(filename); 
    m_imagesList.Images.Add(ResizeImage(Image.FromFile(filename), 100, 100)); 
    lvi.ImageIndex = i; 
    lsvPictures.Items.Add(lvi); 
} 

Et ceci est la fonction qui redimensionne les images:

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; 
} 

Merci! Mosu »

Je viens de découvrir la source des problèmes:

m_imagesList.ColorDepth = ColorDepth.Depth16Bit;

Il coutures que, par défaut, le ColorDepth du ImageList est de 8 bits (ou 4 bits, mais je pense 8). Si je change cela à au moins 16 bits tout semble très bien.

Pour ceux qui ont des problèmes similaires: J'ai beaucoup changé ma méthode Thumbnail avant de réaliser que le contrôle ListView n'utilise pas la profondeur de couleur des images. J'ai mis le résultat de ma méthode sur un contrôle PictureBox et j'ai vu que la fonction fonctionnait correctement. Après cela, j'ai beaucoup googlé ... et j'ai trouvé cette stupide propriété ColorDepth.

Répondre

1

Comment avez-vous défini la résolution de votre image. En outre, avez-vous défini la valeur PixelFormat lorsque vous avez créé le bitmap? J'ai une liste d'images chargeant dans ma vue de liste que je redimensionne semblable à comment vous êtes et cela fonctionne bien sans n'importe quelle distorsion dans les images de miniature résultantes qui sont créées.

Voici un extrait de ma méthode de redimensionnement.

Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb); 
     bitmap.SetResolution(image.HorizontalResolution, image.VerticalResolution); 
     using (Graphics graphics = Graphics.FromImage(bitmap)) 
     { 
      graphics.Clear(Color.Red); 
      graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      graphics.DrawImage(image, 
       new Rectangle(destinationX, destinationY, destinationWidth, destinationHeight), 
       new Rectangle(sourceX, sourceY, originalWidth, originalHeight), 
       GraphicsUnit.Pixel); 
     } 
     return bitmap; 
+0

Merci pour votre réponse. Je change ma méthode pour utiliser la méthode SetResolution mais cela n'améliore pas la qualité de mes images. J'ai également joué avec différentes constantes d'interpolation et de pixels, mais en vain. – mosu

Questions connexes