1

我有一个包含尺寸为 16x16、24x24 和 32x32 的 32 位图像的图标。我创建了三个包含三个不同大小图像的 ImageList 对象,并根据用户选择的大小在我的 ToolStrip 上分配 ImageList 属性。然而,ToolStrip 对象上显示的图像都是 32x32 图像的缩放版本。例如,我无法弄清楚为什么当我创建 16x16 ImageList 时,它不会从图标中提取 16x16 图像。我的代码基本上是这样的:

ImageList m_imageList16 = new ImageList();
m_imageList16.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
m_imageList16.ImageSize = new System.Drawing.Size(16, 16);
m_imageList16.TransparentColor = System.Drawing.Color.Transparent;

// Open is an icon in my resources that contains various sizes of images. 
m_imageList16 .Images.Add(global::MyTestApp.Properties.Resources.Open);

// Later when the user selects the 16 size from a menu, I change the toolbar:
m_toolbar.ImageScalingSize = new Size(16, 16);
m_toolbar.ImageList = m_imageList16;

似乎这只是在我的图标中使用 32x32 大小的图像并将其缩小到 16x16,而不是使用图标中定义的 16x16 图像。有人能帮忙吗?提前感谢您的任何意见!

  • 史蒂夫
4

2 回答 2

1

我找不到任何证据支持我的理论,但 ImageList 似乎不知道选择不同大小的图标。我的直觉是它只是将图标转换为位图并存储该数据。

MSDN 论坛上,我从 MVP 用户 nobugz 那里找到了这个片段:

我想我可以重现你的问题。当我使用 MicroAngelo(一个图标编辑器实用程序)从 shell32.dll 中提取图标 #5,将其保存到磁盘,然后将图标添加到 16x16 ImageList 时,我看到该图标的插值版本很差。当我编辑图标并删除除 16x16x256 颜色之外的所有格式时,我得到了一个漂亮的、清晰的图标版本。

看起来ImageList 不够聪明,无法选择最匹配 ImageList 的 ImageSize和 ColorDepth 属性的图标。它从来都不是一个特别智能的控制。这与您的情况不太匹配,但结果是相同的。看到 32x32 的 PhysicalDimension 提示您在提取图标时出现了问题。我在已编辑图标上看到 16x16,但在未编辑图标上看到 32x32。

此外,来自 CSharpKey 的这个页面似乎是处理 ImageLists 和图标的有用资源。这是一段摘录:

如果要创建图标列表,则可以使用默认大小 16x16 创建每个图标。在某些情况下(例如,如果您打算将图像用于列表视图),您可以创建或设计第二组图标,每个图标的大小为 32x32(和/或 48x48)。

ImageList 仅存储一种尺寸并返回存储的图像的重新采样版本,这似乎是“行间读取”。

编辑

我在 CodeProject ( Embedding Icons in your VB.NET application ) 找到了另一个参考,它说:

好吧,这似乎是一个很好的解决方案,直到我意识到ImageList 仅将图像存储为单一分辨率的位图。因此,如果我想要在整个应用程序中使用所有这些不同尺寸的精美图标,也许使用它们不同的尺寸(因为图标在它们的单个文件中存储了多种尺寸),ImageList 并不会完全削减它。

于 2011-02-18T16:49:40.587 回答
0

我早在 2006 年就提交了这个错误,微软的错误人员回应说他们可以重现这个问题,但这不是一个关键问题,他们不会修复它。

我现在使用适当的 pngs 而不是多尺寸图标。

于 2014-02-09T12:41:00.203 回答