C# 参数“图片”必须是可以用作图标的图片

问题描述 投票:0回答:6

我在将图标导入我的应用程序时遇到问题。我有一个主窗体,我试图通过

Icon
中的
Properties
字段向其导入一个新图标。

图像已采用

.ico
格式:这是我尝试使用的图标的链接

有谁知道为什么 Microsoft Visual Studio 会显示此错误?

Argument 'picture' must be a picture that can be used as an Icon

任何帮助都会很棒。

c# winforms visual-studio-2010 icons
6个回答
26
投票

我最近遇到了这个错误。一些建议:

  • 确保图标是方形的(16x16、32x32)
  • 尝试将其保存为 PNG 并使用此免费服务进行转换:http://www.convertico.com/

7
投票

我们有一个应用程序可以在 99% 的计算机上正常运行,但在一台笔记本电脑上却会弹出此错误。

我们的问题似乎是笔记本电脑用户将屏幕文本/图像大小设置为 150%。这可能会导致原本有效的图像不再有效。我们将看看这是否有效。

更新

评论者似乎也有同样的问题。是的,我们通过将屏幕文本大小设置为小于 150% 解决了这个问题。


5
投票

第二次重新启动,然后自己在 Gimp 中打开并重新保存 .ico 后,我就可以毫无错误地导入它。不太清楚是什么导致了这个问题,但这只是一个奇怪的错误。


1
投票

感谢Xiaohuan ZHOU这个问题中的回答。此功能将 PNG(包括透明度)无损转换为 .ICO 文件格式。

public void ConvertToIco(Image img, string file, int size)
{
    Icon icon;
    using (var msImg = new MemoryStream())
    using (var msIco = new MemoryStream())
    {
        img.Save(msImg, ImageFormat.Png);
        using (var bw = new BinaryWriter(msIco))
        {
            bw.Write((short)0);           //0-1 reserved
            bw.Write((short)1);           //2-3 image type, 1 = icon, 2 = cursor
            bw.Write((short)1);           //4-5 number of images
            bw.Write((byte)size);         //6 image width
            bw.Write((byte)size);         //7 image height
            bw.Write((byte)0);            //8 number of colors
            bw.Write((byte)0);            //9 reserved
            bw.Write((short)0);           //10-11 color planes
            bw.Write((short)32);          //12-13 bits per pixel
            bw.Write((int)msImg.Length);  //14-17 size of image data
            bw.Write(22);                 //18-21 offset of image data
            bw.Write(msImg.ToArray());    // write image data
            bw.Flush();
            bw.Seek(0, SeekOrigin.Begin);
            icon = new Icon(msIco);
        }
    }
    using (var fs = new FileStream(file, FileMode.Create, FileAccess.Write))
    {
        icon.Save(fs);
    }
}

0
投票

在我的情况下,错误是因为我使用了流并且没有确保流指针位于开头。

new Icon(stream)
之前添加以下行解决了问题:

 stream.Seek(0, SeekOrigin.Begin);

0
投票

就我的情况而言。我需要向 imageList 添加一个 Icon 并发生此错误。

var icon = new Icon(IconStream)
imageList1.Images.Add(file.Id, icon);

我解决了这个问题并且成功了

var bitmap = new Bitmap(iconStream);
var icon = Icon.FromHandle(bitmap.GetHicon());
imageList1.Images.Add(file.Id, icon);

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.