#include "stdafx.h"
#define MAKEUS(a, b) ((unsigned short) ( ((unsigned short)(a))<<8 | ((unsigned short)(b)) ))
#define MAKEUI(a,b,c,d) ((unsigned int) ( ((unsigned int)(a)) << 24 | ((unsigned int)(b)) << 16 | ((unsigned int)(c)) << 8 | ((unsigned int)(d)) ))
#define M_DATA 0x00
#define M_SOF0 0xc0
#define M_DHT 0xc4
#define M_SOI 0xd8
#define M_EOI 0xd9
#define M_SOS 0xda
#define M_DQT 0xdb
#define M_DNL 0xdc
#define M_DRI 0xdd
#define M_APP0 0xe0
#define M_APPF 0xef
#define M_COM 0xfe
#include <stdlib.h>
#include <string.h>
int GetPNGWidthHeight(const char* path, unsigned int* punWidth, unsigned int* punHeight)
{
int Finished = 0;
unsigned char uc[4];
FILE *pfRead;
*punWidth = 0;
*punHeight = 0;
if (fopen_s(&pfRead, path, "rb") != 0)
{
printf("[GetPNGWidthHeight]:can't open file:%s\n", path);
return -1;
}
for (int i = 0; i < 4; i++)
fread(&uc[i], sizeof(unsigned char), 1, pfRead);
if (MAKEUI(uc[0], uc[1], uc[2], uc[3])!= 0x89504e47)
printf("[GetPNGWidthHeight]:png format error\n", path);
for (int i = 0; i < 4; i++)
fread(&uc[i], sizeof(unsigned char), 1, pfRead);
if (MAKEUI(uc[0], uc[1], uc[2], uc[3]) != 0x0d0a1a0a)
printf("[GetPNGWidthHeight]:png format error\n", path);
fseek(pfRead, 16, SEEK_SET);
for (int i = 0; i < 4;i++)
fread(&uc[i], sizeof(unsigned char), 1, pfRead);
*punWidth = MAKEUI(uc[0], uc[1], uc[2], uc[3]);
for (int i = 0; i < 4;i++)
fread(&uc[i], sizeof(unsigned char), 1, pfRead);
*punHeight = MAKEUI(uc[0], uc[1], uc[2], uc[3]);
}
int GetJPEGWidthHeight(const char* path, unsigned int *punWidth, unsigned int *punHeight)
{
int Finished = 0;
unsigned char id, ucHigh, ucLow;
FILE *pfRead;
*punWidth = 0;
*punHeight = 0;
if (fopen_s(&pfRead,path, "rb")!=0)
{
printf("[GetJPEGWidthHeight]:can't open file:%s\n", path);
return -1;
}
while (!Finished)
{
if (!fread(&id, sizeof(char), 1, pfRead) || id != 0xff || !fread(&id, sizeof(char), 1, pfRead))
{
Finished = -2;
break;
}
if (id >= M_APP0 && id <= M_APPF)
{
fread(&ucHigh, sizeof(char), 1, pfRead);
fread(&ucLow, sizeof(char), 1, pfRead);
fseek(pfRead, (long)(MAKEUS(ucHigh,ucLow) - 2), SEEK_CUR);
continue;
}
switch (id)
{
case M_SOI:
break;
case M_COM:
case M_DQT:
case M_DHT:
case M_DNL:
case M_DRI:
fread(&ucHigh, sizeof(char), 1, pfRead);
fread(&ucLow, sizeof(char), 1, pfRead);
fseek(pfRead, (long)(MAKEUS(ucHigh,ucLow) - 2), SEEK_CUR);
break;
case M_SOF0:
fseek(pfRead, 3L, SEEK_CUR);
fread(&ucHigh, sizeof(char), 1, pfRead);
fread(&ucLow, sizeof(char), 1, pfRead);
*punHeight = (unsigned int)MAKEUS(ucHigh,ucLow);
fread(&ucHigh, sizeof(char), 1, pfRead);
fread(&ucLow, sizeof(char), 1, pfRead);
*punWidth = (unsigned int)MAKEUS(ucHigh,ucLow);
return 0;
case M_SOS:
case M_EOI:
case M_DATA:
Finished = -1;
break;
default:
fread(&ucHigh, sizeof(char), 1, pfRead);
fread(&ucLow, sizeof(char), 1, pfRead);
printf("[GetJPEGWidthHeight]:unknown id: 0x%x ; length=%hd\n", id, MAKEUS(ucHigh, ucLow));
if (fseek(pfRead, (long)(MAKEUS(ucHigh, ucLow) - 2), SEEK_CUR) != 0)
Finished = -2;
break;
}
}
if (Finished == -1)
printf("[GetJPEGWidthHeight]:can't find SOF0!\n");
else if (Finished == -2)
printf("[GetJPEGWidthHeight]:jpeg format error!\n");
return -1;
}
void GetPicWidthHeight(const char* path, unsigned int *punWidth, unsigned int *punHeight)
{
int len = strlen(path);
if (len<=4)
printf("[GetPicWidthHeight]:picture name is too short\n");
if (!strncmp(path + len - 3, "jpg", 3))
GetJPEGWidthHeight(path, punWidth, punHeight);
else if (!strncmp(path + len - 3, "png", 3))
GetPNGWidthHeight(path, punWidth, punHeight);
else
printf("[GetPicWidthHeight]:only support jpg and png\n");
}
int main(int argc, char *argv[])
{
unsigned int unWidth=0, unHeight=0;
GetPicWidthHeight("2.jpg", &unWidth, &unHeight);
printf("width is %u\n", unWidth);
printf("height is %u\n", unHeight);
system("pause");
return 0;
}
C++获取jpg和png图像的宽和高
4星 · 超过85%的资源 需积分: 34 114 浏览量
2016-03-10
13:12:47
上传
评论 1
收藏 480KB ZIP 举报
IceTeaSet
- 粉丝: 42
- 资源: 5
最新资源
- 基于SSM的电影购票系统 框架:Spring+SpringMVC+MyBatis+JSP
- UE5插件 后台WebApi的Restful接口请求交互
- 易语言简单绘制Demo
- 数值积分-复化梯形求积公式 - 北太天元
- DUmeter-8050exe
- 毕业设计:Java项目之jsp医院药品采购管理系统(源码 + 数据库 + 说明文档)
- JavaScript DOM视频教程包含源码作业及项目实战
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
- UMG图表控件+UE5插件+曲线图、饼图、环状图、柱状图
- 简历-求职简历-word-文件-简历模版免费分享-应届生-高颜值简历模版-个人简历模版-简约大气-大学生在校生-求职-实习
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈