【问题标题】:.Net ToolStrip and ImageList - wrong image size.Net ToolStrip 和 ImageList - 错误的图像大小
【发布时间】:2011-02-18 16:20:49
【问题描述】:

我有一个包含 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 图像。有人能帮忙吗?提前感谢您的任何意见!

  • 史蒂夫

【问题讨论】:

标签: .net image size toolstrip imagelist


【解决方案1】:

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

MSDN forums,我从 MVP 用户 nobugz 那里找到了这个 sn-p:

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

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

此外,this page from CSharpKey 似乎是处理 ImageList 和图标的有用资源。摘录如下:

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

ImageList 似乎只存储一种尺寸并返回存储的图像的重新采样版本。

编辑

我在 CodeProject (Embedding Icons in your VB.NET application) 找到了另一个参考资料,上面写着:

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

【讨论】:

  • 附带说明,您可能对IcoFX 感兴趣,可以编辑图标并查看存储在 .ico 文件中的大小是否符合预期。
  • 非常感谢您的回复,我认为您可能是对的。在我发布该问题后我所做的其他研究中,似乎已添加到资源中的 Icon 的 Height 和 Width 属性值为 32。它似乎没有利用图标文件。该文件确实代表了一个图标组,但我不知道.Net是否有任何这样的概念。
  • 检查我在答案中引用的最后一个来源,以将图标作为资源嵌入。此外,您可能希望拥有多个 ImageList,每个都有特定的分辨率,并根据需要分配给工具栏。
【解决方案2】:

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

我现在使用合适的 png 代替多尺寸图标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多