列出视图控件显示失真的图像

时间:2009-10-13 19:32:53

标签: c# list view

我在Windows窗体应用程序中遇到了ListView控件的问题。 即使我创建缩略图或调整真实大小,我也会在列表视图中看到扭曲的图像。 当您放大图像时,图像看起来很像。 我首先想到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;

它接缝,默认情况下,ImageList的ColorDepth是8位(或4位,但我猜是8)。如果我把它改为至少16位,一切看起来都很不错。

对于那些有类似问题的人:在我意识到ListView控件没有使用图像所具有的颜色深度之前,我经常更改了Thumbnail方法。我将我的方法的结果放在PictureBox控件上,看到该函数正在运行。这是我google了很多...并发现了愚蠢的ColorDepth属性。

2 个答案:

答案 0 :(得分:1)

您是如何为图像设置分辨率的?此外,您在创建位图时是否设置了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;

答案 1 :(得分:0)

我也在WinForms中使用ListView来显示目录,并且遇到了同样的问题。我建议您检查图像文件类型:图标文件(.ico)最终会变形,因此请尝试使用扩展名为.png的图像文件。这对我有用:

git rev-list --parents --all