У меня проблема с элементом управления ListView в приложении Windows Form.
Даже если я создаю уменьшенное изображение или изменяю размер реального, я получаю искаженные изображения в виде списка.
Изображение выглядит, когда вы сильно увеличиваете изображение.
Сначала я подумал, что GetThumbnailImage обрабатывает это, но я использовал код изменения размера, который нашел здесь, и у меня тот же результат.
Я также не нашел ни одной ошибки, связанной с управлением просмотром списка, поэтому я догадываюсь, что делаю что-то не так, но просто не могу понять, что именно.
Вот код, который я использую:
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);
}
И это функция, которая изменяет размеры изображений:
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;
}
Спасибо!
MOSU '
Я только что нашел источник проблем:
m_imagesList.ColorDepth = ColorDepth.Depth16Bit;
Похоже, что по умолчанию ColorDepth в ImageList равен 8 битам (или 4 битам, но я предполагаю, что 8). Если я изменю это по крайней мере на 16 бит, все выглядит очень хорошо.
Тем, у кого похожие проблемы: я очень изменил метод Thumbnail, прежде чем понял, что элемент управления ListView не использует глубину цвета, которую имели изображения. Я поместил результат моего метода в элемент управления PictureBox и увидел, что функция работает корректно. После этого я много гуглил ... и обнаружил это глупое свойство ColorDepth.