将字节数组中的.ico转换为.net中的Image对象时出现问题

Reb*_*off 12 .net gdi+

我正在尝试使用favicons并将它们添加到我正在创建的动态图像中.请参阅StackFlair.网站代码在本地工作正常,并在一个共享托管服务器上. 等等,免费托管计划,你得到你付出的代价,等等等等我麻烦的是我从一个新的托管设置中得到一个例外. 此异常仅发生在.ico文件中. 我可以在我测试过的所有服务器上处理.gif和.png图像(例如,一个gravatar图像).我尝试使用的favicon是来自SE网络的favicons,但即使http://www.google.com/favicon.ico也会导致以下异常.

System.ArgumentException:参数无效.

  • System.Drawing.Image.FromStream(Stream stream,Boolean useEmbeddedColorManagement,Boolean validateImageData)
  • System.Drawing.Image.FromStream(Stream stream)

我正在尝试的代码的变化如下.对于所有变体,我得到相同的参数无效异常.

byte[] imageBytes = //pull from Image field in SQL Server
//or
byte[] imageBytes = new WebClient().DownloadData(imageUrl);


MemoryStream ms = new MemoryStream(imageBytes);
Image image = Image.FromStream(ms);
 //or
Icon icon = new Icon(ms);
Image image = icon.ToBitmap();
//or
Image image = new Bitmap(ms);
Run Code Online (Sandbox Code Playgroud)

所有这些工作在本地和坏主机服务器上都很好.它们都不能在我想要的服务器上运行.通过使用Trace输出,我可以验证数组的长度是否包含正确的字节数.如果我执行以下操作,则会看到图像按预期显示.

Response.Clear();
Response.BinaryWrite(imageBytes);
Response.End();
Run Code Online (Sandbox Code Playgroud)

如果我循环遍历数组并写出每个字节值,则输出从我的本地实例到我得到异常的服务器是相同的.

如果它有帮助,我的代码不起作用的服务器是带有sp2的Windows 2003服务器.

很明显,框架告诉我字节流无效,但我检查过的所有内容都会检出.关于为什么这个特定服务器在.ico文件上窒息的任何想法?

Tom*_*son 2

我有一个解决方法。使用 ImageMagick 将 ico 文件转换为 png 文件:

convert favicon.ico[0] favicon.png
Run Code Online (Sandbox Code Playgroud)

那么这些就很容易使用了。ImageMagick 预安装在许多共享主机上,或者您也可以下载适用于 Windows 的预编译二进制文件。

如果您省略 [0],那么如果 .ico 文件中存储了多个图标图像,您将获得一系列文件 favicon-0.png favicon-1.png 等。然后,您需要对它们进行排序,选择最接近您想要的:16x16,具有 alpha 透明度。(我在我的图标文件中包含 32x32 和 48x48,供将 Internet 快捷方式拖动到桌面的 IE 用户使用。)ImageMagick 在转换为 png 时保留透明度。

stackapps.com/favicon.ico 齿轮图标有两个图像。第一个具有 Alpha 透明度,在浅灰色 #DBDCDB 背景上看起来很棒。

我假设您正在服务器上构建像https://i.stack.imgur.com/SNHfF.png这样的动态图像,而不是将所有 6 个顶级站点图标发送到浏览器。如果没有,发送转换为 png 的图标仍然是一个好主意,因为它们不是设计用于在网页中呈现的。

...汤姆