C++ 获取jpg和png的图片宽和高,不使用第三方库
原文地址:https://blog.csdn.net/qq_30749883/article/details/53199130
可以的,不需要使用第三方库,C++原生封装
#pragma once
#include <stdio.h>
#include <tchar.h>
#include <SDKDDKVer.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);elseprintf("[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;
}
如果您觉得这篇博文有用,请访问我的个人站:http://www.stubbornhuang.com/,更多博文干货等着您。
C++ 获取jpg和png的图片宽和高,不使用第三方库相关推荐
- CTF--图片隐写之修改图片宽和高
这也是做图片杂项时前几步需要考虑的,有时没有任何线索就去修改宽高 比如我们拿到这样一个图片一看这个图片就明显缺失了一部分,直接去修改图片的宽和高,查看一下图片的宽高:1119*512.将1119转换成 ...
- java获取webp格式图片宽和高 以及普通文件的宽和高 图片宽高
try {// ImageIO.read报错的解决方法String fileType = ImgeMimeTypeUtils.getMimeType(facePathFile.getAbsoluteP ...
- android 控件高度和图片一样高,Android 根据图片宽高比例设置控件宽高
这个方式适用于一个界面少量图片. 主要的计算公式就是得到当前控件最大的显示宽度(高度),一般填充屏幕的话,就直接取屏幕的宽度了. 得到宽度除以图片宽除以高,也可以直接得到图片宽高的比例.如下公式 这种 ...
- python获取视频缩略图_python接收图片变成缩略图
python图像处理库:Pillow初级教程 Image类 Image.resize()和Image.thumbnail()的区别 根据代码和代码注释, 这两个函数都是对图片进行缩放, 两者的主要区别 ...
- Android 正确获取View的宽和高
Android 在实际开发过程中,我们可能经常要获取View的宽和高,那么如何来正确获取一个View的宽和高呢. View提供了getWidth(),getHeight(),getMeasureWid ...
- yshon对讲机如何调频率_窄带宽、窄脉宽、高重复频率,主动调Q光纤激光器是如何实现的?...
文 / 毛庆和.姚波.张骥 中国科学院合肥物质科学研究院主动调Q 光纤激光器及优势 大能量纳秒脉冲激光在激光清洗.雷达探测.精密加工及非线性变频等领域具有极其重要的应用.通常,这类脉冲激光由高品质纳秒 ...
- vue-preview动态获取图片宽高并增加旋转功能
vue-preview是一个常用的图片查看器,微博网页版就是用的这个插件: 我在项目中也用过这个插件,总体来说,还是比较满意.但是缺少一个图片旋转功能. 安装使用 第一步:安装 npm i vue-p ...
- JS快速获取图片宽高的方法
JS快速获取图片宽高的方法 快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括I ...
- android 通过图片url获取宽高_通过 URL 获取图片宽高优化
一张小图.png 前言 客户端研发时,有时会有这样的需求,需要根据图片链接地址获取图片的宽高来进行界面排版. 一般比较正规的做法,是服务端在返回数据时将图片的信息属性一起带回来,这也符合轻客户端设计规 ...
最新文章
- 九度 1371 最小的K个数
- 实现一个多线程循环的类
- 骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)
- The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install
- Node.js 使用axios读写influxDB
- AI视觉,视频云新挑战的解决之道
- java bitset_Java BitSet or()方法与示例
- 电脑编程python和c加加语言的区别_小猿圈之Bash 和 Python 编程语言优缺点
- ISO27001标准的起源和发展
- elipse手机设备显示Target unknown解决方法
- 计算机三级网络技术备考复习资料
- android textview全部属性,Android TextView属性大全
- RGMII(Reduced Gigabit Media Independent Interface)
- 什么是次世代游戏建模?角色和场景建模,哪个比较容易
- 看我是如何严辞拒绝同学借钱的
- ISV 和SI 是什么
- 新一代区块链手机“甲骨文”即将上市
- 寻找100以内的质数
- 密码学系列 - 椭圆曲线 ECC - ED25519
- 海比研究院专访伙伴云VP袁兆江:大厂入局,低代码赛道如何突围?