关于.JPG、.BMP、.GIF、.PNG等格式转换为.ico格式的问题

whywhatwhat 2009-03-02 09:28:21
以下的代码是把JPG转换成ICON的代码

System.Drawing.Image image1 = System.Drawing.Image.FromFile(@"C:\test.bmp");
image1.Save(@"C:\test.ico", System.Drawing.Imaging.ImageFormat.Icon);

整个过程没有任何问题或报错。

生成的test.ico也成功在指定位置出现,但问题是没有图象显示!这是怎么回事?请各位大虾指导!
(注:试过把.JPG转换为.bmp、.gif、.png都没有问题,可以正常显示的)
...全文
2564 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
spiderexcel 2009-03-14
  • 打赏
  • 举报
回复
http://forums.spiderexcel.com (全英文)
论坛主要包括以下主题:
Motherboards,Bios,CPU & Hard Drive
RAM and Power Supply
Video Card & Sound Cards
Laptop & Driver
Networking
Windows 98/ME/Vista/XP/2000/2003/2008
Linux & Mac
Microsoft Office
Internet Explorer & Moxilla/Firefox Browsers
HTML & Website Design
Graphics & Multimedia
Programming
Site & Server Administration
Databases
Content Management
Online Gaming
PC Gaming
Console Gaming
whywhatwhat 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 zgke 的回复:]
引用 24 楼 whywhatwhat 的回复:
引用 22 楼 zgke 的回复:
不是....

你还的按ICON的方式保存... 你把文件头的东西读出来了.再保存回去没问题把.


这没太大问题,不过我还是不明白...读出来的流就包含了象素信息了吗?


包含的.. 知识结构不头
256色 以下 是颜色表来决定颜色..
一个象素占一个字节 这个字节放的是颜色索引表的索引号..

24位 R G B占用3个字节

32位 A R G B 占用4个字节

24和32位…
[/Quote]

因为涉及到的知识有限,有没有相关的内容介绍给小弟我去学习然后再为此问题直接解决呢?
zgke 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 whywhatwhat 的回复:]
引用 22 楼 zgke 的回复:
不是....

你还的按ICON的方式保存... 你把文件头的东西读出来了.再保存回去没问题把.


这没太大问题,不过我还是不明白...读出来的流就包含了象素信息了吗?
[/Quote]

包含的.. 知识结构不头
256色 以下 是颜色表来决定颜色..
一个象素占一个字节 这个字节放的是颜色索引表的索引号..

24位 R G B占用3个字节

32位 A R G B 占用4个字节

24和32位是没有颜色表的.. 另外在ICON里32位可以直接透明..不需要进行掩码处理.
whywhatwhat 2009-03-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zgke 的回复:]
不是....

你还的按ICON的方式保存... 你把文件头的东西读出来了.再保存回去没问题把.
[/Quote]

这没太大问题,不过我还是不明白...读出来的流就包含了象素信息了吗?
  • 打赏
  • 举报
回复
up
zgke 2009-03-11
  • 打赏
  • 举报
回复
不是....

你还的按ICON的方式保存... 你把文件头的东西读出来了.再保存回去没问题把.
zgke 2009-03-10
  • 打赏
  • 举报
回复
System.IO.FileStream _FileStream = new System.IO.FileStream(IconFile, System.IO.FileMode.Open);
byte[] IconData = new byte[_FileStream.Length];
_FileStream.Read(IconData, 0, IconData.Length);
_FileStream.Close();

获取文件的byte

000(000)2    保留的字节            00 00
002(002)2    资源类型             01 00 (01为图标,02为光标)
004(004)2    图象个数             01 00
对应下面的.
_IdReserved = BitConverter.ToUInt16(IconData, 0);
_IdType = BitConverter.ToUInt16(IconData, 2);
_IdCount = BitConverter.ToUInt16(IconData, 4);
zgke 2009-03-10
  • 打赏
  • 举报
回复
C# 一个字节一个自己的读出来不就好了 或则做个结构体..在这里C#和C++ 有什么区别呢?
whywhatwhat 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 zgke 的回复:]
文件结构。

一、文件头6字节)
000(000)2    保留的字节            00 00
002(002)2    资源类型             01 00 (01为图标,02为光标)
004(004)2    图象个数             01 00
 (二、图像信息块16字节)
006(006)1    图标宽度             10
007(007)1    图标高度             10
008(008)1   …
[/Quote]

如何实现?该不会是C++的吧?
zgke 2009-03-10
  • 打赏
  • 举报
回复
文件结构。

一、文件头6字节)
000(000)2    保留的字节            00 00
002(002)2    资源类型             01 00 (01为图标,02为光标)
004(004)2    图象个数             01 00
 (二、图像信息块16字节)
006(006)1    图标宽度             10
007(007)1    图标高度             10
008(008)1    颜色计数             10(02=单色, 00≥256色) 如果24,32色那就是0
009(009)1    未用                00
010(00A)4    保留的              00 00 00 00
014(00E)4    图象数据块的长度  28 01 00 00(10进制=296)
018(012)4    图象数据块相对于文件头部的偏移量 16 00 00 00(10进制=22)
 (三、BMP信息头40字节)
022(016)4    BMP 信息头结构长度        28 00 00 00(10进制=40)
026(01A)4    图像宽度              10 00 00 00
030(01E)4    图像高度(XOR图高度+AND图高度) 20 00 00 00
这个是和BMP不同是BMP的两倍
034(022)2    位面板数 01 00
036(024)2    每象素所占位数 04 00
038(026)4    象素数据的压缩类型        00 00 00 00(表示未压缩)
042(02A)4    图象数据的长度          C0 00 00 00(10进制=192)
046(02E)16   未用               16个00
 (四、XOR位图的调色板64字节) 后面的如果是24色32色 用不上.全0把
062(03E)1    蓝色分量
063(03F)1    绿色分量
064(040)1    红色分量
065(041)1    未用               00
  ……
 (五、XOR位图的数据)
126(07E)128   XOR位图             
 (六、单色AND位图的数据)
254(0FE)64   AND位图
whywhatwhat 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zgke 的回复:]
引用 10 楼 youfayoutian 的回复:
顶, 关键是详细说明+举例说明一下ICON和bmp文件的格式


这帖还没结呢。.. 这个其实很简单的我BLOG里的程序你复制出来打开个图形跟一次你就明白了。..
[/Quote]

大哥...问题还没解决...请详解!
whywhatwhat 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mamudelingling 的回复:]
你用bitmap试试 我刚试过了 转换的图片可以显示

Bitmap bitmap = new Bitmap(openFileDialog1.FileName);
bitmap.Save("aa.ico", System.Drawing.Imaging.ImageFormat.Icon);
[/Quote]
象素不能保证,我试过出现了问题...
whywhatwhat 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zgke 的回复:]
放心可以的.. 只要你数据正确就可以了.
[/Quote]

是不是
System.IO.FileStream _FileStream = new System.IO.FileStream(IconFile, System.IO.FileMode.Open);
byte[] IconData = new byte[_FileStream.Length];
_FileStream.Read(IconData, 0, IconData.Length);
_FileStream.Close();

读取完的数据流再用BITMAP去创建图象?然后再调用SAVE()方法保存图象?
zgke 2009-03-10
  • 打赏
  • 举报
回复
放心可以的.. 只要你数据正确就可以了.
whywhatwhat 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 whywhatwhat 的回复:]
引用 17 楼 zgke 的回复:
System.IO.FileStream _FileStream = new System.IO.FileStream(IconFile, System.IO.FileMode.Open);
byte[] IconData = new byte[_FileStream.Length];
_FileStream.Read(IconData, 0, IconData.Length);
_FileStream.Close();

获取文件的byte

000(000)2    保留的字节            00 00
002(002)2    资源类型    …
[/Quote]

我要的是ICON方面的,因为做的是转为ICON格式文件且保证图象不失真!
whywhatwhat 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zgke 的回复:]
System.IO.FileStream _FileStream = new System.IO.FileStream(IconFile, System.IO.FileMode.Open);
byte[] IconData = new byte[_FileStream.Length];
_FileStream.Read(IconData, 0, IconData.Length);
_FileStream.Close();

获取文件的byte

000(000)2    保留的字节            00 00
002(002)2    资源类型             01 00 …
[/Quote]

这么做能确保图象数据不失真?
zgke 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 youfayoutian 的回复:]
顶, 关键是详细说明+举例说明一下ICON和bmp文件的格式
[/Quote]

这帖还没结呢。.. 这个其实很简单的我BLOG里的程序你复制出来打开个图形跟一次你就明白了。..
医手 2009-03-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 whywhatwhat 的回复:]
引用 5 楼 zgke 的回复:

http://blog.csdn.net/zgke/archive/2008/11/12/3279327.aspx


大哥!能不能标注意思呀?我读不懂你的那个ICON代码
[/Quote]
顶, 关键是详细说明+举例说明一下ICON和bmp文件的格式
mamudelingling 2009-03-06
  • 打赏
  • 举报
回复
你用bitmap试试 我刚试过了 转换的图片可以显示

Bitmap bitmap = new Bitmap(openFileDialog1.FileName);
bitmap.Save("aa.ico", System.Drawing.Imaging.ImageFormat.Icon);
whywhatwhat 2009-03-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zgke 的回复:]
你使用
image1.Save(@"C:\test.ico", System.Drawing.Imaging.ImageFormat.Icon);
你保存的不是ICO格式的文件

是IHDR结构的图形.... 系统对ICON支持非常少..

你可以使用下面的..
http://blog.csdn.net/zgke/archive/2008/11/12/3279327.aspx
[/Quote]

大哥!能不能标注意思呀?我读不懂你的那个ICON代码
加载更多回复(7)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧