项目中使用Android解析JPEG码流,在此记录一下思路,一切以下方的实例分析图片数据信息编写。

目录

JPEG图片格式

1.SOI(0xFFD8):图片开始段

2.APP0(0xFFE0)

3.APPn(0xFFEn)可选

4.DQT(0xFFDB):量化表段

5.SOF0(0xFFC0):帧开始段

6.DHT(0xFFC4):Huffman表段

7.DRI可选

8.SOS(0xFFDA):扫描开始段

9.压缩图像数据

10.EOI(0xFFD9):图像结束段

实例分析:

具体部分代码如下:


JPEG图片格式

1.SOI(0xFFD8):图片开始段

名称 字节数
段标识 1 FF
段类型 1 D8

2.APP0(0xFFE0)

名称 字节数 说明
段标识 1 FF
段类型 1 E0
段长度 2 00 10
标识符 5 4A 46 49 46 00 “JFIF0”
主版本号 1 01
次版本号 1 01
密度单位 1 01 0表示无单位;1表示点数/英寸;2表示点数/厘米
X方向像素密度 2 00 78 水平方向像素密度
Y方向像素密度 2 00 78 竖直方向像素密度
缩略图水平像素数目 1 00
缩略图垂直像素数目 1 00
缩略图RGB位图 3×n,n=缩略图像素总数=缩略图X像素×缩略图Y像素;缩略图X像素和缩略图Y像素的值都大于0,才有该值

3.APPn(0xFFEn)可选

名称 字节数 说明
应用程序保留标记n 2 0xFFE1~0xFFF n=1~15,记录地点、时间等信息
数据段长度 2

4.DQT(0xFFDB):量化表段

名称 字节数 说明
段标识 1 FF JPEG文件一般有2个DQT段,Y值(亮度)1个, C值(色度)1个。
段类型 1 DB 一个DQT段可以包含多个QT, 每个都有自己的信息字节
段长度 2 00 43
量化表信息 1 00 量化表信息:0-3位;QT号:4-7位(0=8bit;否则=16bit)
量化表内容 64 08 06 ... n = 64 × QT精度的字节数,即64×1

5.SOF0(0xFFC0):帧开始段

名称 字节数 说明
段标识 1 FF
段类型 1 C0
段长度 2 00 11 = 8+组件数量×3
精度 1 08
图片高度 2 00 14
图片宽度 2 00 14
组件数量 1 03 1=灰度图,3=YCbcr或YIQ彩色图,4=CMYK彩色图
//Y颜色分量
组件ID 1 01 1=Y,2=Cb,3=Cr,4=I,5=Q
采样系数 1 22 0~3位:垂直采样系数,4~7位:水平采样系数
量化表号 1 00
//Cb颜色分量
组件ID 1 02
采样系数 1 11
量化表号 1 01
//Cr颜色分量 Y采样是逐点采样,CbCr都是隔点采样,这就是标准的YUV422的数据。
组件ID 1 03
采样系数 1 11
量化表号 1 01

6.DHT(0xFFC4):Huffman表段

名称 字节数 说明
段标识 1 FF
段类型 1 C4
段长度 2 00 1F
HT信息 1 00 0~3位:HT号;4位:HT类型(0=DC表,1=AC表);5~7位:必须=0
HT位表 16 ... 16个数的和≤256
HT值表 n ... n=位表16个数的和
HT位表:00 01 05 01 01 01 01 01 01 00 00 00 00 00 00 00
HT值表:00 01 02 03 04 05 06 07 08 09 0A 0B
数量
00
01 00
05 01 02 03 04 05
01 06
01 07
01 08
01 09
01 0A
01 0B
00
00
00
00
00
00
00

注:此处有四个DHT表,只举一个例子。

7.DRI可选

8.SOS(0xFFDA):扫描开始段

名称 字节数 说明
段标识 1 FF
段类型 1 DA
段长度 2 00 0C
扫描组件数量 1 03
//组件1
01 1 1=Y,2=Cb,3=Cr,4=I,5=Q
00 1 Huffman表号 0~3位:AC表号,4~7位:DC表号
//组件2
02 1
11 1
//组件3
03 1
11 1
3 00 3F 00 意义不明确,忽略

9.压缩图像数据

10.EOI(0xFFD9):图像结束段

实例分析:

使用UltraEdit软件将图片转为16进制形式(随便截取了一张图片,20像素×20像素)

具体部分代码如下:

由于硬件传输至APP中是有包头,包头数据信息等一大堆乱七八糟的东西的,而且我做的这个项目,硬件端协议(如上图所示,SOI后边就是JPEG的格式了)对我来说不太明确的(但是还好我是硬件出身的,是懂硬件怎么传输的),一步一步摸索过来。比如说整个包长度4185字节,包头数据信息89字节,剩下的其实是4096,也就是说硬件每次传输4K字节,算一下就知道了(我真是个大SB),然后数据(FF D8 ...)我还不知道怎么处理,后来才有了前边的JPEG数据结构分析。

还有一个事就是,我以为图片解码是要我自己编程解码,后来是试试看的想法,也是懂了JPEG格式,将数据流写入文件,然后将文件变成JPEG格式,我觉得就可以显示图片了。后来去对应路径去验证,确实可以,只能说手机性能过剩,可能是硬解码牛逼。

//获取数据流
inputStream = socket.getInputStream();
len = inputStream.read(dwMagicCode);//这个是将数据流读取数据到数组,我这个写法是把dwMagicCode读满
while (true) {if (new String(dwMagicCode).equals("ZAKJ")) {//包头识别len = inputStream.read(wSizeArray);wSize = Integer.parseInt(ConvertDataToInt(wSizeArray, 0), 16);//包长度Log.d("TReqReceive+wSize", String.valueOf(wSize));len = inputStream.read(wCmdIdArray);wCmdId = Integer.parseInt(ConvertDataToInt(wCmdIdArray, 0), 16);//命令buffer = new byte[wSize - 12];len = inputStream.read(buffer);if(wCmdId == enNetCmd.CMD_PostSnapFileData){//命令码3024PictureData = new byte[wSize - 89];FileName = new String(buffer, 25, 6);//文件名称System.arraycopy(buffer, 77, PictureData, 0, wSize - 89);File newfile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/ftp" +"/"+FileName+".JPG");//根据文件名称及路径,创建文件try {if (!newfile.exists()){newfile.createNewFile();}FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/ftp" +"/"+FileName+".JPG",true);fos.write(PictureData);//数据流输出fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
}

Android开发——JPEG码流分析相关推荐

  1. android代码流分析工具,视频码流分析工具(Elecard StreamAnalyzer)下载 v4.0.171116 官方版 - 比克尔下载...

    Elecard StreamAnalyzer是一个专业的视频码流分析工具,拥有码流错误报告.TS错误侦测和基于ETSI TR101-290的分析功能,能够对编码器媒体流进行深入的句法分析,支持H.26 ...

  2. 音视频方案,音视频扩展内容- 音视频数据解析,码流分析及质量评价(笔记)3

    -- 音视频编解码流程如下图: -- 关于音频各种参数: freq:音频数据的采样率.常用的有48000,44100等. format:音频数据的格式.举例几种格式: AUDIO_U16SYS:Uns ...

  3. 完成一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  4. 音视频开发——H265码流解析

    概述 H.265技术的应用 编码技术主要运用于视频播放设备.软件应用以及拍摄.录制视频的设备.人们最熟悉的莫过于PPS网络视频播放器.在PC屏客户端产品上面,PPS已经于2013年初推出了基于H.26 ...

  5. 一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  6. 我的HEVC码流分析工具MFC小笔记:树形控件使用及窗口缩放

    大约1个半月前,发布了自己写的HEVC码流分析工具.当时的版本显示语法元素使用是的Edit控件.很多主流分析工具都使用树形控件,看上去觉得比较高端,于是在纠结一天后下定决心自己也实现树形的HEVC语法 ...

  7. IPTV码流分析指标

    针对IPTV码流可以分析如下指标(参考蓝拓扑公司的IPTV码流分析产品) 视频内容质量分析 被动式的视频平均意见分(MOS)测量 实时对所选的IPTV 和VOD 节目进行音视频回放 MPEG PES ...

  8. Android开发/源码资源汇总

    最全的Android开源音乐播放器源码汇总 http://neast.cn/forum.php?mod=viewthread&tid=9586&fromuid=5 Android 直播 ...

  9. 实现一个avs2码流分析工具

    最近在做avs2编码器项目,但是却没有成熟的码流分析工具,于是抽空学习了QT,业余时间写了一个avs2码流分析工具. 软件的界面如下: 图1.avs2码流分析仪界面 UI的左边框为NAL列表或者语法元 ...

最新文章

  1. Redis安装与卸载
  2. SAP MM 采购申请单据ITEM数据里的Closed标记
  3. Java中super函数的用法
  4. python科学计算笔记(一)NumPy中ndarray对象、ufunc运算、矩阵运算
  5. Redis入门到精通-Redis数据类型
  6. iCMS v8.0.0多终端内容管理系统
  7. 实现自己的类加载时 重写方法loadClass与findClass的区别
  8. 甜甜的爱情+美食完美情人节海报,PSD分层模板轻松搞定设计,拿去用!
  9. 如何在多个SQL Server上运行备份
  10. mysql免安装版的下载与安装
  11. 新手坐高铁怎么找车厢_坐动车怎么找车厢
  12. 电磁场仿真——绘制电场线和等势线
  13. 分公司可以作为著作权人申请软件著作权登记证书么?
  14. 计算化学对计算机知识的要求,计算化学软件对大学有机化学教学的应用
  15. 2021年中国果蔬汁行业供需分析:产量同比增长2.4%[图]
  16. Hive:常用系统函数-聚合函数
  17. SpringBoot GA/PRE/SNAPSHOT含义
  18. ucenter用户中心头像修改,不使用自带方法,不使用flash 转
  19. wx2540h配置教程_求高手解决H3C无线网络 WX3024E和无线AP设备之间的详细配置命令!...
  20. c语言 (3×3)矩阵转置

热门文章

  1. 应用程序正常初始化(0xc00000ba)失败修复工具
  2. 怎么将heic转换格式,如何打开heic文件?
  3. matlab求连个书叫大叔,科学计算与MATLAB语言尔雅答案
  4. Opencv-python学习路线与图像处理方面的相关技能树(西瓜6总结)
  5. 仿芒果TV微信小程序源码
  6. 基于Java的仓库管理系统的研究与实现
  7. 【ML】第五章 支持向量机
  8. Oracle 11g使用透明数据加密保护存储数据
  9. 南京大学2020管理科学与工程考研
  10. JavaRandom函数介绍