#include <stdio.h> // 保留,在读取 png 头部信息的是,每次读取到 0D 0A 读取就会产生错误,如果 0D 0A 修改为其他的数据,则数据可以正常读取,不知道为什么 ---- 文件打开的时候, 将读取文件的方式设置为 二进制 流文件读取就可以。 //typedef struct //{ // char HeadInfo[8]; // 文件头信息 // int IhderChunkLength; // IHDR 数据块的长度信息 // int IhderChunkType; // IHDR 数据块类型码 // 下面是数据块的具体数据了, 最前面两个是png 图片的宽高 // int PngImgWidth; // 宽 // int PngImgHeght; // 高 //} PNG_FILE_HEAD; /* * 函数说明: 读取 png 文件中,图片的宽高信息 * 参数描述: pathName, 输入参数,文件的路径名信息 * w, h, 输出参数,图片的宽高信息 * 返回值: 0,成功 * -1,失败 * 备注信息: PNG 文件头数据信息如下所示: * * 文件头信息:8 字节 * IHDR 数据块的长度信息:4 字节 * IHDR 数据块类型码 :4 字节 * png 图片宽:4 字节 * png 图片高:4 字节 */ #define PNG_WH_DATA_OFFSET 16 int getPngImgSize(const char* pathName, int* w, int* h) { FILE* fp = NULL; int imgWidth= 0; int imgHeight = 0; if(NULL == pathName) return -1; fp = fopen(pathName, "rb"); // 只读方式打开 (二进制方式) if( NULL == fp ) { return -1; } fseek(fp, PNG_WH_DATA_OFFSET, SEEK_SET); fread(&imgWidth, sizeof(imgWidth), 1, fp); fread(&imgHeight, sizeof(imgHeight), 1, fp); fclose(fp); if(w) { // 设置数据的高低位信息 *w = 0x00000000; *w |= (imgWidth<<24)&0xff000000; *w |= (imgWidth<< 8)&0x00ff0000; *w |= (imgWidth>> 8)&0x0000ff00; *w |= (imgWidth>>24)&0x000000ff; } if(h) { *h = 0x00000000; *h |= (imgHeight<<24)&0xff000000; *h |= (imgHeight<< 8)&0x00ff0000; *h |= (imgHeight>> 8)&0x0000ff00; *h |= (imgHeight>>24)&0x000000ff; } return 0; } int main(int argc, char** argv) { char chInput = 0; int imgWidth = 0; int imgHeght = 0; printf("Read png imgae size \n"); getPngImgSize("003.png", &imgWidth, &imgHeght); getPngImgSize("002.png", &imgWidth, &imgHeght); getPngImgSize("001.png", &imgWidth, &imgHeght); // test input chInput = getchar(); return 0; } |