原文地址: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的图片宽和高,不使用第三方库相关推荐

  1. CTF--图片隐写之修改图片宽和高

    这也是做图片杂项时前几步需要考虑的,有时没有任何线索就去修改宽高 比如我们拿到这样一个图片一看这个图片就明显缺失了一部分,直接去修改图片的宽和高,查看一下图片的宽高:1119*512.将1119转换成 ...

  2. java获取webp格式图片宽和高 以及普通文件的宽和高 图片宽高

    try {// ImageIO.read报错的解决方法String fileType = ImgeMimeTypeUtils.getMimeType(facePathFile.getAbsoluteP ...

  3. android 控件高度和图片一样高,Android 根据图片宽高比例设置控件宽高

    这个方式适用于一个界面少量图片. 主要的计算公式就是得到当前控件最大的显示宽度(高度),一般填充屏幕的话,就直接取屏幕的宽度了. 得到宽度除以图片宽除以高,也可以直接得到图片宽高的比例.如下公式 这种 ...

  4. python获取视频缩略图_python接收图片变成缩略图

    python图像处理库:Pillow初级教程 Image类 Image.resize()和Image.thumbnail()的区别 根据代码和代码注释, 这两个函数都是对图片进行缩放, 两者的主要区别 ...

  5. Android 正确获取View的宽和高

    Android 在实际开发过程中,我们可能经常要获取View的宽和高,那么如何来正确获取一个View的宽和高呢. View提供了getWidth(),getHeight(),getMeasureWid ...

  6. yshon对讲机如何调频率_窄带宽、窄脉宽、高重复频率,主动调Q光纤激光器是如何实现的?...

    文 / 毛庆和.姚波.张骥 中国科学院合肥物质科学研究院主动调Q 光纤激光器及优势 大能量纳秒脉冲激光在激光清洗.雷达探测.精密加工及非线性变频等领域具有极其重要的应用.通常,这类脉冲激光由高品质纳秒 ...

  7. vue-preview动态获取图片宽高并增加旋转功能

    vue-preview是一个常用的图片查看器,微博网页版就是用的这个插件: 我在项目中也用过这个插件,总体来说,还是比较满意.但是缺少一个图片旋转功能. 安装使用 第一步:安装 npm i vue-p ...

  8. JS快速获取图片宽高的方法

    JS快速获取图片宽高的方法 快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括I ...

  9. android 通过图片url获取宽高_通过 URL 获取图片宽高优化

    一张小图.png 前言 客户端研发时,有时会有这样的需求,需要根据图片链接地址获取图片的宽高来进行界面排版. 一般比较正规的做法,是服务端在返回数据时将图片的信息属性一起带回来,这也符合轻客户端设计规 ...

最新文章

  1. 九度 1371 最小的K个数
  2. 实现一个多线程循环的类
  3. 骑士周游算法 c语言_C语言经典算法04--骑士走棋盘(骑士旅游:Knight tour)
  4. The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install
  5. Node.js 使用axios读写influxDB
  6. AI视觉,视频云新挑战的解决之道
  7. java bitset_Java BitSet or()方法与示例
  8. 电脑编程python和c加加语言的区别_小猿圈之Bash 和 Python 编程语言优缺点
  9. ISO27001标准的起源和发展
  10. elipse手机设备显示Target unknown解决方法
  11. 计算机三级网络技术备考复习资料
  12. android textview全部属性,Android TextView属性大全
  13. RGMII(Reduced Gigabit Media Independent Interface)
  14. 什么是次世代游戏建模?角色和场景建模,哪个比较容易
  15. 看我是如何严辞拒绝同学借钱的
  16. ISV 和SI 是什么
  17. 新一代区块链手机“甲骨文”即将上市
  18. 寻找100以内的质数
  19. 密码学系列 - 椭圆曲线 ECC - ED25519
  20. 海比研究院专访伙伴云VP袁兆江:大厂入局,低代码赛道如何突围?

热门文章

  1. 加密基础知识二 非对称加密RSA算法和对称加密
  2. 网站被百度飓风算法2.0命中,已做完整改措施,看看几天恢复
  3. 【笑小枫的SpringBoot系列】【十五】SpringBoot根据模板生成Word
  4. Android之紧急拨号的处理
  5. 封禁、下架!微信出手了,规范整治数字藏品平台!
  6. 例题3-6 环状序列(Circular Sequence)
  7. ‘见附件/附件’怎么用英语说?
  8. 2017-11-11 今天的工作任务
  9. Python爬取起点小说并保存到本地文件夹和MongoDB数据库中
  10. '操作必须使用一个可更新的查询'解决方法