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. #ECMASCRIPT6笔记

    ECMASCRIPT6笔记 来源于http://es6.ruanyifeng.com/#docs/proxy 是我在阅读时做下的笔记,方便以后查阅 Symbol ES5 的对象属性名都是字符串,这容易 ...

  2. springbank 开发日志 SpringMVC是如何找到handler找到对应的方法并执行的

    从DispatcherServlet说起,本文讨论的内容都是DispatcherServlet的doDispatch方法完成 mappedHandler是一个HandlerExecutionChain ...

  3. thinkphp搭建后台品字形框架页面

    页面分为三个部分 head,left,right共同组成了index 在indexController中 function Index(){ $this->display(); } //展现后腰 ...

  4. python 字符串组成MySql 命令时,字符串含有单引号或者双引号导致出错解决办法

    引用自:https://blog.csdn.net/zhaoya_huangqing/article/details/48036839 一.在组成SQL语句并发送命令时完全按照Python中的样式去传 ...

  5. 017 在SecureCRT中安装rz小工具

    1.安装yum 2.上传本地的文件进虚拟机 3.注意点 只是属于SecureCRT的命令,同时,在上传的位置是现在所在的位置 4.测试

  6. scanf清除缓存区

    为什么需要清除scanf缓存区呢?看一个例子: int main() { int a,b; scanf("%d",&a); scanf("%d",&am ...

  7. Dart语言特性必备了解!

    学习Dart语言,必须将以下的概念熟记于心: 在dart语言中,一切皆为对象.所有的对象都是一个类的实例.甚至整数.函数.null也看做是对象.所有的对象都继承于Object类 尽管Dart是强类型语 ...

  8. 17,EasyNetQ-替换EasyNetQ组件

    EasyNetQ是一个由小型组件组成的库. 当你写: var bus = RabbitHutch.CreateBus("host=localhost"); ...静态方法Creat ...

  9. AGC01 A - BBQ Easy

    目录 题目链接 题解 代码 题目链接 AGC01 A - BBQ Easy 题解 贪心 排序之后从大到小,没两组取小的那个 代码 #include<cstdio> #include< ...

  10. BZOJ.4767.两双手(组合 容斥 DP)

    题目链接 \(Description\) 棋盘上\((0,0)\)处有一个棋子.棋子只有两种走法,分别对应向量\((A_x,A_y),(B_x,B_y)\).同时棋盘上有\(n\)个障碍点\((x_i ...