int extract_pic_info(const BYTE *pic, const uint32_t size, int &width, int &height)
{
int ret = -;
width = ;
height = ;
size_t offset = ;
if (pic == NULL)
return ret;
if ((pic[] == 'G') && (pic[] == 'I') && (pic[] == 'F') && (pic[] == '') && (pic[] == '' || '') && (pic[] == 'a'))
{
//gif
offset = ;
width = MAKEUS(pic[offset + ], pic[offset]);
offset += ;
height = MAKEUS(pic[offset + ], pic[offset]);
ret = ;
SS_DEBUG((LM_DEBUG, "extract_pic_info: gif width(%d) height(%d)!\n", width, height));
} else if ((pic[] == 'B') && (pic[] == 'M'))
{
//BMP
offset = ;
width = MAKEUI(pic[offset + ], pic[offset + ], pic[offset + ], pic[offset + ]);
offset += ;
height = MAKEUS(pic[offset + ], pic[offset]);
ret = ;
SS_DEBUG((LM_DEBUG, "extract_pic_info: BMP width(%d) height(%d)!\n", width, height));
} else if (pic[] == png_signature[] && pic[] == png_signature[] && pic[] == png_signature[]
&& pic[] == png_signature [] && pic[] == png_signature[]
&& pic[] == png_signature[] && pic[] == png_signature[] && pic[] == png_signature[])
{
//PNG
offset = ;
width = MAKEUI(pic[offset + ], pic[offset + ], pic[offset + ], pic[offset + ]);
offset += ;
height = MAKEUI(pic[offset + ], pic[offset + ], pic[offset + ], pic[offset + ]);
ret = ;
SS_DEBUG((LM_DEBUG, "extract_pic_info: PNG width(%d) height(%d)!\n", width, height));
} else if (pic[] == && pic[] == && pic[size-] == && pic[size-] == )
{
//JPEG
bool finish = false;
offset = ;
unsigned char id = ;
while(!finish && offset < size)
{
if (pic[offset++] != 0xff || offset >= size)
{
ret = -;
SS_DEBUG((LM_DEBUG, "extract_pic_info: JPEG format error!\n"));
break;
}
id = pic[offset++];
if (id >= M_APP0 && id <= M_APPF) // app data block
{
offset += MAKEUS(pic[offset], pic[offset + ]);
continue;
}
switch(id)
{
case M_SOI:
break;
case M_COM:
case M_DQT:
case M_DHT:
case M_DNL:
case M_DRI:
offset += MAKEUS(pic[offset], pic[offset + ]);
break;
case M_SOF0:
offset += ;
height = MAKEUS(pic[offset], pic[offset + ]);
offset += ;
width = MAKEUS(pic[offset], pic[offset + ]);
finish = true;
ret = ;
SS_DEBUG((LM_DEBUG, "extract_pic_info: JPEG width(%d) height(%d)!\n", width, height));
break;
case M_SOS:
case M_EOI:
case M_DATA:
finish = true;
ret = -;
SS_DEBUG((LM_DEBUG, "extract_pic_info: JPEG can't find SOF0!\n"));
break;
default:
offset += MAKEUS(pic[offset], pic[offset + ]);
break;
}
}
}
return ret;
}

JPEG的每个标记都是由2个字节组成,其前一个字节是固定值0xFF。每个标记之前还可以添加数目不限的0xFF填充字节(fill byte)。下面是其中的8个标记:

1.   SOI 0xD 图像开始

2.   APP0 0xE0 JFIF应用数据块

3.   APPn 0xE1 - 0xEF 其他的应用数据块(n, 1~15)

4.   DQT 0xDB 量化表

5.   SOF0 0xC0 帧开始

6.   DHT 0xC4 霍夫曼(Huffman)表

7.   SOS 0xDA 扫描线开始

8.   EOI 0xD9 图像结束

不依赖三方库从图像数据中获取宽高-gif、bmp、png、jepg的更多相关文章

  1. Adatper中获取宽高为0的问题

    但是我们想在getView()中获取ImageView的宽和高存在问题,在getView()里面刚开始显示item的时候利用ImageView.getWidth() 获取的都是0,为什么刚开始获取不到 ...

  2. DOM中获取宽高、位置总结

    原生JS 一.文档.窗口的宽高和位置 // 获取屏幕的宽高 window.screen.height | window.screen.width // 屏幕可用工作区宽高 window.screen. ...

  3. js中获取宽高

    <script type="text/javascript"> function getWH() { var a = ""; a += " ...

  4. canvas基础入门(一)canvas的width、height于css样式中的宽高区别

    canvas的width.height于css样式中的宽高对画布的内容显示是有所区别的 1.在canvas标签下调用他的width和height,而且是没有单位的宽高,这种指定canvas大小的方法也 ...

  5. 【IE6的疯狂之一】IE6中奇数宽高的BUG

    IE6真是太疯狂了.今天由于项目需要做了这么一个布局:一个外部的相对定位div,内部一个绝对定位的div(right:0), 如图: 可是在IE6下查看,却变成了right:1px的效果了: IE6还 ...

  6. js中各种宽高

    各种宽高 Javascript: IE中:document.body.clientWidth ==> BODY对象宽度document.body.clientHeight ==> BODY ...

  7. JavaScript 中禁止用户右键菜单,复制,选取,Ctrl,Alt,Shift. 获取宽高,清除浮动

    //禁用右键菜单 document.oncontextmenu = function(){ event.returnValue = false; } //禁用选取内容 document.onselec ...

  8. 第76天:jQuery中的宽高

    Window对象和document对象的区别 1.window对象表示浏览器中打开的窗口 2.window对象可以省略,比如alert()也可以写成window.alert() Document对象是 ...

  9. js/jQuery中的宽高

    一.和window有关的宽高 window.innerWidth:浏览器窗口宽度 window.innerHeight:浏览器窗口高度(不包括导航,工具栏等的高度) window.outerWidth ...

随机推荐

  1. Redis 5.0 集群搭建

    Redis 5.0 集群搭建 单机版的 Redis 搭建 https://www.jianshu.com/p/b68e68bbd725 /usr/local/目录 mkdir redis-cluste ...

  2. hdu 1217 汇率 Floyd

    题意:给几个国家,然后给这些国家之间的汇率.判断能否通过这些汇率差进行套利交易. Floyd的算法可以求出任意两点间的最短路径,最后比较本国与本国的汇率差,如果大于1,则可以.否则不可以. 有向图 一 ...

  3. ElasticSearch - How to search for a part of a word with ElasticSearch

    Search a part of word with ElasticSearch 来自stackoverflow https://stackoverflow.com/questions/6467067 ...

  4. struts2的文件上传和文件下载

    实现使用Struts2文件上传和文件下载: 注意点: (1)对应表单的file1和私有成员变量的名称必须一致 <input type="file" name="fi ...

  5. asp.net core环境变量详解

    环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...

  6. html5 选择多张图片在页面内预览并上传到后台

    版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.csdn.net/huangxin112/article/details/74956462 需求:点击选择图片(可选多张) ...

  7. 最短路(Bellman)-Hdu1874畅通工程序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目: 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城 ...

  8. shell 安装使用VIM

    安装:http://jingyan.baidu.com/article/046a7b3efd165bf9c27fa915.html ubuntu系统: 普通用户下输入命令:sudo apt-get i ...

  9. Python学习——异常处理

    1.异常基础: 在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面 基本语法: try: pass except Exception as e: pri ...

  10. Python中的pass的作用

    1.pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作2.保证格式完整 3.保证语义完整 以if语句为例,在c或c++/java中: ? if(true) ;//do ...