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. 【转】ssh服务器启动和客户端常用操作

    前言 简单的来说,SSH 是 Secure SHell protocol 的简写 (安全的壳程序协议),它可以透过数据封包加密技术,将等待传输的封包加密后再传输到网络上, 因此,数据讯息当然就比较安全 ...

  2. 数据库中的null用法

  3. JDK的get请求方式

    package com.example.wang.testapp3; import android.app.ProgressDialog; import android.os.Bundle; impo ...

  4. python全栈开发day12-函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数、global和nonlocal的进一步解析和总结

    1.上周回顾 1).函数名的应用 直接打印函数名,是函数的地址 变量 函数的参数 函数的返回值 可以当容器类数据类型的元素 2).闭包 内层函数对外层函数的非全局变量的引用,就是闭包. 并返回内部函数 ...

  5. Ubuntu 16.04 LTS 安装Mongodb 3.4

    第一步:安装 #setp 1. Import the public key used by the package management system. sudo apt-key adv --keys ...

  6. 洛谷 P1824 进击的奶牛 【二分答案】(求最大的最小值)

    题目链接:https://www.luogu.org/problemnew/show/P1824 题目描述 Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚, ...

  7. POJ 2337 Catenyms(有向欧拉图:输出欧拉路径)

    题目链接>>>>>> 题目大意: 给出一些字符串,问能否将这些字符串  按照 词语接龙,首尾相接  的规则 使得每个字符串出现一次 如果可以 按字典序输出这个字符串 ...

  8. Python读取大文件的"坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...

  9. 几个文本处理工具的简单使用(wc,cut,sort,uniq,diff和patch)

    wc wc命令用于报告文本文件的一些统计计数,例如行数.单词数.字节数等. 语法如下. wc [OPTION]... [FILE]... wc [OPTION]... --files0-from=F ...

  10. ApplicationListener<ContextRefreshedEvent>接口,Spring启动后获取所有拥有特定注解的Bean

    最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的是ApplicationContextAware,在setApplicationCon ...