大侠,可以告诉我怎么用C语言以2进制读取png图片的宽和高吗?谢了!!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大侠,可以告诉我怎么用C语言以2进制读取png图片的宽和高吗?谢了!!!相关的知识,希望对你有一定的参考价值。

添加62字节的头信息就可以了!

第一部分为位图文件头BITMAPFILEHEADER,是一个结构,其定义如下:
typedefstructtagBITMAPFILEHEADER
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
BITMAPFILEHEADER;
这个结构的长度是固定的,为14个字节(WORD为无符号16位整数,DWORD为无符号32位整数),各个域的说明如下:
bfType
指定文件类型,必须是0x424D,即字符串 "BM ",也就是说所有.bmp文件的头两个字节都是 "BM "
bfSize
指定文件大小,包括这14个字节
bfReserved1,bfReserved2
为保留字,不用考虑
bfOffBits
为从文件头到实际的位图数据的偏移字节数,即图3中前三个部分的长度之和。
第二部分为位图信息头BITMAPINFOHEADER,也是一个结构,其定义如下:
typedef struct tagBITMAPINFOHEADER
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
BITMAPINFOHEADER;
这个结构的长度是固定的,为40个字节(WORD为无符号16位整数,DWORD无符
号32位整数,LONG为32位整数),各个域的说明如下:
biSize
指定这个结构的长度,为40
biWidth
指定图象的宽度,单位是象素
biHeight
指定图象的高度,单位是象素
biPlanes
必须是1,不用考虑
biBitCount
指定表示颜色时要用到的位数,常用的值为1(黑白二色图),4(16色图),8(256色),24(真彩色图)(新的.bmp格式支持32位色,这里就不做讨论了)。
biCompression
指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS(都是一些Windows定义好的常量)。要说明的是,Windows位图可以采用RLE4,和RLE8的压缩格式,但用的不多。我们今后所讨论的只有第一种不压缩的情况,即biCompression 为BI_RGB的情况。
biSizeImage
指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:
biSizeImage=biWidth '*biHeight
要注意的是:上述公式中的biWidth '必须是4的整倍数(所以不是biWidth,而是biWidth ',表示大于或等于biWidth的,离4最近的整倍数。举个例子,如果biWidth=240,则biWidth '=240;如果biWidth=241,biWidth '=244)如果biCompression为BI_RGB,则该项可能为零
biXPelsPerMeter
指定目标设备的水平分辨率,单位是每米的象素个数,关于分辨率的概念,我们将在打印部分详细介绍。
biYPelsPerMeter
指定目标设备的垂直分辨率,单位同上。
biClrUsed
指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次方。
biClrImportant
指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。
第三部分为调色板(Palette),当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,前面已经讲过,是不需要调色板的,BITMAPINFOHEADER后直接是位图数据。
调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2的biBitCount次方个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:
typedef struct tagRGBQUAD
BYTE rgbBlue; //该颜色的蓝色分量
BYTE rgbGreen; //该颜色的绿色分量
BYTE rgbRed; //该颜色的红色分量
BYTE rgbReserved; //保留值
RGBQUAD;
第四部分就是实际的图象数据了。对于用到调色板的位图,图象数据就是该像素颜在调色板中的索引值,对于真彩色图,图象数据就是实际的R,G,B值。下面就2色,16色,256色位图和真彩色位图分别介绍。
对于2色位图,用1位就可以表示该像素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个像素。
对于16色位图,用4位可以表示一个像素的颜色,所以一个字节可以表示2个像素。
对于256色位图,一个字节刚好可以表示1个像素。
对于真彩色图,三个字节才能表示1个像素,哇噻,好费空间呀,没办法,谁叫你想让图的颜色显得更亮丽呢,有得必有失嘛。
要注意两点:
1.每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage时已经提到了。
2.一般来说,.BMP文件的数据从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个像素,然后是左边第二个像素…接下来是倒数第二行左边第一个像素,左边第二个像素…依次类推,最后得到的是最上面一行的最右一个像素。

了解这些以后呢 可以通过以二进制的方式“rb”打开你想读取的png图片

FILE *fp
if(!(fp=open(“filename”,rb)))
printf(“open file error”);

打开成功后就可以通过文件指针读取文件内容了。
参考技术A LS的完全在胡说八道,LZ问的是PNG,你就回答bmp,png的文件结构跟bmp的结构根本不一样.png文件的宽在文件开始偏移量17的位置,宽是四个字节组成的,所以高就在21的位置,可参考:http://bbs.66rpg.com/thread-41652-1-1.html
下面是代码

int Change(BYTE *tmp)

for (int i=0,j=3;i<2,j>1;i++,j--)

BYTE b=tmp[i];
tmp[i]=tmp[j];
tmp[j]=b;

return *(int*)tmp;


int main(int argc, char* argv[])

int w=0,h=0;
BYTE wtmp[4]='0';
BYTE htmp[4]='0';
FILE *fp=fopen("3.png","rb");
fseek(fp,16L,SEEK_SET);
fread(wtmp,4,1,fp);
fread(htmp,4,1,fp);
fclose(fp);
w=Change(wtmp);
h=Change(htmp);
printf("宽:%d,高:%d\n",w,h);

return 0;
本回答被提问者采纳

用C语言读取16位bmp图片的每个像素的信息~

用C语言。
网上有很多24位图的,所以就不用麻烦大家了~
但是我们老师要求要16位,256的都要,我就头大了~
哪位大侠好心帮帮忙~~~

没有什么不同。
读出 BITMAPINFO 结构:
typedef struct tagBITMAPINFO
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
BITMAPINFO;
以后,

BITMAPINFOHEADER 结构 里就有 biBitCount
biBitCount 等于 16 就是16位,等于24 就是24位,等于32 就是32位。

颜色在哪,要考虑 biCompression 压缩方法,若等于 BI_RGB, bmiColors 就等于 NULL. 在 bitmap 数组里 每个WORD 就是 一个像素点. 5个 bits 兰,5个 bits 绿,再5个 bits 红,最高位不用。
其它方法自己看资料吧。
参考技术A 一个道理啊
VC做??

以上是关于大侠,可以告诉我怎么用C语言以2进制读取png图片的宽和高吗?谢了!!!的主要内容,如果未能解决你的问题,请参考以下文章

C语言怎么读取二进制文件中的数据放到一个300×300的二维数组里面

C语言中怎样获得jpg图片的宽和高?

我想问怎么用c语言实现对一个二进制报文的读取(报文里是以太网,IP,UDP,DNS,ARP,TCP

C语言怎么把起始地址输出来,用十进制数字,可以吗,教教我

用C++写的二进制文件,用JAVA怎么读取?

c语言文件读写,如何正确的存取多位数(int)