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.
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