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. Ext.js入门(二)

        ExtJs OOP基础 一:ExtJs中的面向对象 1.ExtJs中命名空间的定义        Ext中的命名空间类似于C#中的namespace和java中的包,用来对工程中的类进行更好的 ...

  2. 【C++ Primer | 06】 函数

    contexpr函数 const用于运行期常量,constexpr用于编译期常量 • [test1.cpp] #include <iostream> using namespace std ...

  3. python全栈开发day34-线程Thread

    一.昨日内容回顾 1. 概念和理论 进程是计算机资源分配最小单位 进程三状态.同步.异步.阻塞.非阻塞 2. 进程的创建 实例化.自建类run,start,join,terminate,daemon等 ...

  4. Linux 关闭网络管理服务

    1 将NetworkManager 服务设置开机不启动 chkconfig NetworkManager off 2将NetwokManager服务关闭 service NetworkManager ...

  5. Jquery empty() remove() detach() 方法的区别

    方法简介: empty() This method removes not only child (and other descendant) elements, but also any text ...

  6. MooFest POJ1990

    题意: 一群牛参加完牛的节日后都有了不同程度的耳聋,第i头

  7. ADI SHARC 学习之PLL

    PLL Block Diagram             Power Management Registers (PMCTL, PMCTL1)The following sections descr ...

  8. hdu 1394 (线段树求逆序数)

    <题目链接> 题意描述: 给你一个有0--n-1数字组成的序列,然后进行这样的操作,每次将最前面一个元素放到最后面去会得到一个序列,那么这样就形成了n个序列,那么每个序列都有一个逆序数,找 ...

  9. 实现分布式服务注册及简易的netty聊天

    现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式.用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线. ZK有一个功能,就是创建临时节点,当机 ...

  10. 洛谷.1782.旅行商的背包(背包DP 单调队列)

    题目链接(卡常背包) 朴素的多重背包是: \(f[i][j] = \max\{ f[i-1][j-k*v[i]]+k*w[i] \}\),复杂度 \(O(nV*\sum num_i)\) 可以发现求\ ...