Управление представлением списка, отображающее искаженные изображения - PullRequest
0 голосов
/ 13 октября 2009

У меня проблема с элементом управления 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.

Ответы [ 2 ]

1 голос
/ 14 октября 2009

Как вы установили разрешение для вашего изображения. Кроме того, что вы установили значение PixelFormat при создании растрового изображения? У меня есть список изображений, загружаемых в мой список, размер которых изменяется так же, как и у вас, и он работает нормально без каких-либо искажений в получаемых миниатюрах.

Вот фрагмент моего метода изменения размера.

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 голосов
/ 18 апреля 2019

Я также использовал ListView в WinForms для отображения каталогов, и у меня возникла та же проблема. Я предлагаю вам проверить тип файла изображения: файлы значков (.ico) имеют тенденцию искажаться, поэтому попробуйте использовать файл изображения с расширением .png. Это работает для меня:

ListView listView = new ListView();
ImageList imageList = new ImageList();
// add image to list:
imageList.Images.Add("image_key", image_path);
// give the listview the imagelist:
listView.SmallImageList = imageList;
// add item to listview:
listView.Items.Add("item_text", "image_key");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...