200分c/c++/java/c#读取png图片 200
这个问题小弟在各大论坛写了无数次了但始终找不到合适的答案http://zhidao.baidu.com/question/155961482.html这个网址是我原来提问...
这个问题小弟在各大论坛写了无数次了 但始终找不到合适的答案
http://zhidao.baidu.com/question/155961482.html 这个网址是我原来提问的如果您的答案跟他们答得类似就算了
小弟想知道 如果自己写一个读取png图片并将它用"点"的形式画在屏幕上(即知道png图像每个像素点的ARGB值)
我已经知道了怎么样用c语言以2进制读取png图片得到图像的宽高
1、但是对怎么判断 CRC (循环冗余检测)的具体算法不懂(如果可以请高手们详细列举出来 最好有个具体的例子)
2、如果能写一个函数 函数的返回值是一个2维数组 数组中的元素是图片对应的ARGB值 就更好了
我不要什么网下载的资料或者用别人封装好的库函数(这个东西我比你的多)
只要纯正的代码
万分感谢 如果您回答了以上2个问题 并且我采纳了 我可以刷分给您 我现有财富40000都可以给您
多谢2楼 但是我要的不是这个 我也知道你说的这个东西 我要的是自己写出来的代码
不用widows提供的库函数 就用最简单的io和流程控制语句 自己读取png图片并且知道每个点的argb值
3楼谢谢你对我第一个问题的描述 我另外提一个crc的问题 你去回答我给你100分 这个问题 我就不关了
让人继续回答第二个 展开
http://zhidao.baidu.com/question/155961482.html 这个网址是我原来提问的如果您的答案跟他们答得类似就算了
小弟想知道 如果自己写一个读取png图片并将它用"点"的形式画在屏幕上(即知道png图像每个像素点的ARGB值)
我已经知道了怎么样用c语言以2进制读取png图片得到图像的宽高
1、但是对怎么判断 CRC (循环冗余检测)的具体算法不懂(如果可以请高手们详细列举出来 最好有个具体的例子)
2、如果能写一个函数 函数的返回值是一个2维数组 数组中的元素是图片对应的ARGB值 就更好了
我不要什么网下载的资料或者用别人封装好的库函数(这个东西我比你的多)
只要纯正的代码
万分感谢 如果您回答了以上2个问题 并且我采纳了 我可以刷分给您 我现有财富40000都可以给您
多谢2楼 但是我要的不是这个 我也知道你说的这个东西 我要的是自己写出来的代码
不用widows提供的库函数 就用最简单的io和流程控制语句 自己读取png图片并且知道每个点的argb值
3楼谢谢你对我第一个问题的描述 我另外提一个crc的问题 你去回答我给你100分 这个问题 我就不关了
让人继续回答第二个 展开
3个回答
展开全部
没必要那么麻烦.只要使用GDI+库里面的Bitmap对象和Graphics对象就可以了。WindowsXP以上的OS都提供GDI+图形接口了,他的功能比GDI接口更强大,使用更方便。建议你可以查查GDI+的用法。这里给你个最简单的C#的例子:
System.Drawing.Bitmap bmp = new Bitmap("1.png");//创建Bitmap对象
System.Drawing.Color c = bmp.GetPixel(0, 0);//获得图像上(0,0)点的像素值
int a = c.A;//该像素的Alpha通道值
int r = c.R;//该像素的红色通道值
int g = c.G;//该像素的绿色通道值
int b = c.B;//该像素的蓝色通道
那建议你上网查一查PNG格式的标准,就知道PNG文件里的数据排列了。但PNG是压缩过的,所以你还得有解压算法才行。
png的存储格式:
关键数据块中有4个标准数据块:
文件头数据块IHDR(header chunk):包含有图像基本信息,作为第一个数据块出现并只出现一次。
调色板数据块PLTE(palette chunk):必须放在图像数据块之前。
图像数据块IDAT(image data chunk):存储实际图像数据。PNG数据允许包含多个连续的图像数据块。
图像结束数据IEND(image trailer chunk):放在文件尾部,表示PNG数据流结束。
在第二个数据块中包含了调色板数据块。可是,当我们去解析png24时,却未找到调色板、并且我们发现png24的存储模式是点阵颜色值加一位的阿尔法通道值构成的,这种存储模式根本不需要调色板的存在。基于这种存储模式,png24的位深最低是32位真彩,在我们看到的图像过渡中会很圆润,因为每个点都可以是不同的色彩以及不同的透明值。而这种模式也是我们最常使用、大家所理解中的png模式。至于"png"后面的“24”可见也和位深并无关系,至于为什么叫24,我也没有找到具体的答案。
png24源数据中无调色盘的存在,而在标准数据块的第二块中,却显示了调色板数据块。即然存在,肯定是有意义的,可见png有另外一种存储模式--带色盘的png8模式。png8有点类似于GIF,包含了一个调色板,并在调色板上有一个透明颜色值,这种模式在计算机的存储中,每个点阵存储的是色盘索引、并且无阿尔法半透明位。所以,png8在颜色位深上,可以低于32位;也可以使用更换色盘的技术来处理一些独特的效果;但是由于每个点阵没有阿尔法定义,边缘会像GIF一样存在锯齿现像。
好像讲的有点乱,总结一下区别吧:
png8和png24的根本区别,不是颜色位的区别,而是存储方式不同;
png8 色盘索引、调色板中一位透明值、不支持阿尔法通道的半透明,存储格式中每个像素无透明度的数据块定义;
png24 无调色板、支持阿尔法通道的半透明、每个点阵都有透明度的定义,最低32位真彩色;
特性
支持256色调色板技术以产生小体积文件
最高支持48位真彩色图像以及16位灰度图像。
支持阿尔法通道的半透明特性。
支持图像亮度的gamma校正信息。
支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。
使用无损压缩
渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。
使用CRC循环冗余编码防止文件出错。
最新的PNG标准允许在一个文件内存储多幅图像。
看。有使用无损压缩和多幅图像。挺复杂的哦!
http://codex.wordpress.org.cn/index.php?diff=prev&oldid=88484
看下面W3C的网站介绍。你就知道有多复杂了。不用库函数,我觉得你的想法太不现实。对与BMP这样格式还可以,对于PNG,不行。
http://www.w3.org/TR/2003/REC-PNG-20031110/
System.Drawing.Bitmap bmp = new Bitmap("1.png");//创建Bitmap对象
System.Drawing.Color c = bmp.GetPixel(0, 0);//获得图像上(0,0)点的像素值
int a = c.A;//该像素的Alpha通道值
int r = c.R;//该像素的红色通道值
int g = c.G;//该像素的绿色通道值
int b = c.B;//该像素的蓝色通道
那建议你上网查一查PNG格式的标准,就知道PNG文件里的数据排列了。但PNG是压缩过的,所以你还得有解压算法才行。
png的存储格式:
关键数据块中有4个标准数据块:
文件头数据块IHDR(header chunk):包含有图像基本信息,作为第一个数据块出现并只出现一次。
调色板数据块PLTE(palette chunk):必须放在图像数据块之前。
图像数据块IDAT(image data chunk):存储实际图像数据。PNG数据允许包含多个连续的图像数据块。
图像结束数据IEND(image trailer chunk):放在文件尾部,表示PNG数据流结束。
在第二个数据块中包含了调色板数据块。可是,当我们去解析png24时,却未找到调色板、并且我们发现png24的存储模式是点阵颜色值加一位的阿尔法通道值构成的,这种存储模式根本不需要调色板的存在。基于这种存储模式,png24的位深最低是32位真彩,在我们看到的图像过渡中会很圆润,因为每个点都可以是不同的色彩以及不同的透明值。而这种模式也是我们最常使用、大家所理解中的png模式。至于"png"后面的“24”可见也和位深并无关系,至于为什么叫24,我也没有找到具体的答案。
png24源数据中无调色盘的存在,而在标准数据块的第二块中,却显示了调色板数据块。即然存在,肯定是有意义的,可见png有另外一种存储模式--带色盘的png8模式。png8有点类似于GIF,包含了一个调色板,并在调色板上有一个透明颜色值,这种模式在计算机的存储中,每个点阵存储的是色盘索引、并且无阿尔法半透明位。所以,png8在颜色位深上,可以低于32位;也可以使用更换色盘的技术来处理一些独特的效果;但是由于每个点阵没有阿尔法定义,边缘会像GIF一样存在锯齿现像。
好像讲的有点乱,总结一下区别吧:
png8和png24的根本区别,不是颜色位的区别,而是存储方式不同;
png8 色盘索引、调色板中一位透明值、不支持阿尔法通道的半透明,存储格式中每个像素无透明度的数据块定义;
png24 无调色板、支持阿尔法通道的半透明、每个点阵都有透明度的定义,最低32位真彩色;
特性
支持256色调色板技术以产生小体积文件
最高支持48位真彩色图像以及16位灰度图像。
支持阿尔法通道的半透明特性。
支持图像亮度的gamma校正信息。
支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。
使用无损压缩
渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。
使用CRC循环冗余编码防止文件出错。
最新的PNG标准允许在一个文件内存储多幅图像。
看。有使用无损压缩和多幅图像。挺复杂的哦!
http://codex.wordpress.org.cn/index.php?diff=prev&oldid=88484
看下面W3C的网站介绍。你就知道有多复杂了。不用库函数,我觉得你的想法太不现实。对与BMP这样格式还可以,对于PNG,不行。
http://www.w3.org/TR/2003/REC-PNG-20031110/
展开全部
PNG格式非常复杂,要用最简单的io和流程控制语句 自己读取png图片比较困难,但是也不是没有可能,大家都习惯用库函数,所以没有这方面的代码。
PNG是经过压缩,要获取它的某个像素点,就要解压缩,这就需要对PNG文件格式有很深入的了解。至于源代码,可以参考PNG的官方开源库libpng,里面有PNG一切的代码,不过比较复杂。
http://www.libpng.org/pub/png/libpng.html
源代码里有一个pngget.c文件,看看有没有你想要的
也可以参考zlib的代码,一个第3方库
http://www.zlib.net/
PNG解压缩后就应该可以获取像素点值了,也可以制作成Bitmap就可以用GetPixel()这个Windows API。
CRC检验,也叫除法检验,这里有一个具体的例子
http://wenku.baidu.com/view/ce7d2429bd64783e09122bda.html
PNG是经过压缩,要获取它的某个像素点,就要解压缩,这就需要对PNG文件格式有很深入的了解。至于源代码,可以参考PNG的官方开源库libpng,里面有PNG一切的代码,不过比较复杂。
http://www.libpng.org/pub/png/libpng.html
源代码里有一个pngget.c文件,看看有没有你想要的
也可以参考zlib的代码,一个第3方库
http://www.zlib.net/
PNG解压缩后就应该可以获取像素点值了,也可以制作成Bitmap就可以用GetPixel()这个Windows API。
CRC检验,也叫除法检验,这里有一个具体的例子
http://wenku.baidu.com/view/ce7d2429bd64783e09122bda.html
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
png 是由两张bmp图片组成,第一张是正常图片,第二张是掩码图片,两张图一起购成了透明图片,如果你把png当成bmp(扩展名改为bmp)是可以看到第一张图的。
具体结构倒是不知道了,估计和icon一样
下面这个是icon的结构,你可以试试和png是不是一样:
struct ICONFILEHEADER
{
WORD wReserved;
WORD wType;
WORD wCount;
};
struct ICONENTRY
{
BYTE btWidth;
BYTE btHeight;
BYTE btColors;
BYTE btReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwSizeImage;
DWORD dwFileOffset;
};
bmp文件格式:
位图文件头 BITMAPFILEHEADER
BITMAPINFO{
位图信息图 BITMAPINFOHEADER
颜色表 RGBQUAD
}
位图数据
具体结构请看msdn
或者输入这些结构名称上网搜
具体结构倒是不知道了,估计和icon一样
下面这个是icon的结构,你可以试试和png是不是一样:
struct ICONFILEHEADER
{
WORD wReserved;
WORD wType;
WORD wCount;
};
struct ICONENTRY
{
BYTE btWidth;
BYTE btHeight;
BYTE btColors;
BYTE btReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwSizeImage;
DWORD dwFileOffset;
};
bmp文件格式:
位图文件头 BITMAPFILEHEADER
BITMAPINFO{
位图信息图 BITMAPINFOHEADER
颜色表 RGBQUAD
}
位图数据
具体结构请看msdn
或者输入这些结构名称上网搜
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询