flex压缩图片exif信息(作者/相机)丢失问题解决

所属分类: 网络编程 / Flex 阅读数: 2101
收藏 0 赞 0 分享
在用flex的jpegencoder对图片进行压缩的时候,exif信息会丢失,也就是图片的作者,用的相机,神马的,全部都没有了,怎么办呢?

经研究jpeg的文档,最终解决这个问题
1.jpeg的文件格式,分成一个一个frame,每个frame以0xFF打头,然后跟着一个标识未,比如0xFFD8表示文件的开始,0xFFD9表示文件结束,紧接着标识位的是这个frame的长度,长度不包括0xFF和标识位,但包括这个2个字节的长度,比如一个frame开始了,先是一个0xFF然后是一个0xXX,然后是两个0x0010,说明这个frame的长度是16,整个frame的长度其实是18,

2.我们要研究的是图片的exif信息,他的标识位是0xE1
而且这个0xE1有两种情况,第一种,就是紧跟着文件头,就是0xE1,第二种,就是在0xE1之前还有一个0xE0,
所以在把这个byteArray在如到图片对象之前,先要获取到这个0xE1的frame的所有数据,代码如下:
复制代码 代码如下:

//获取0xFFE1 app1也就是exif信息
var tempData:ByteArray = new ByteArray();
//这里的e.target.data是图片的原始byteArray
tempData.writeBytes(e.target.data,0,e.target.data.bytesAvailable);
tempData.position = 3; //读取第四个字节
var exif:Number = tempData.readUnsignedByte();
if(exif == 0xE1) { //看这个字节是不是0xE1
this.Debug("有exif信息");
//读一个长度
var exifLength:Number = tempData.readUnsignedShort();
file_item.exifArray.writeBytes(tempData,tempData.position-2,exifLength); //如果是,将exif信息读入一个文件对象
} else if(exif == 0xE0) { //是e0,那么跳过这个frame,看下边
tempData.position = 4;
var e0Length:Number = tempData.readUnsignedShort();
tempData.position = 4+e0Length;//跳过e0
tempData.position += 1;//跳过0xff
var isEx:Number = tempData.readUnsignedByte();
if(isEx==0xE1) {
var len:Number = tempData.readUnsignedShort();
file_item.exifArray.writeBytes(tempData,tempData.position-2,len);
}
}

然后处理完了这些,我们就需要把这段frame给插到压缩之后的byteArray里
代码的逻辑应该一目了然的,嘿嘿
复制代码 代码如下:

if(file_item.exifArray.length>0) { //写入exif信息
var desData:ByteArray = new ByteArray();
desData.writeBytes(oldData,0,2);//0xffd8
desData.writeByte(0xff);
desData.writeByte(0xe1);
desData.writeBytes(file_item.exifArray,0,file_item.exifArray.bytesAvailable);
desData.writeBytes(oldData,2,oldData.bytesAvailable);
desData.position = 0;
this.uploadFileTest(desData,file_item);
} else {
this.uploadFileTest(e.target.ba,file_item);
}
更多精彩内容其他人还在看

flex4.0 利用外部项呈示器显示List信息并添加图片示例

利用外部项呈示器显示List信息并添加图片,在本文有个不错的示例,喜欢的朋友可以参考下,希望对大家有所帮助
收藏 0 赞 0 分享

Flex实现双轴组合图的设计思路及代码

组合图是有柱状图和折线图组合的,柱状图显示的数据是依据左边的竖直轴,折线图的数据依据右边的竖直轴,详细实现请看本文,希望对大家有所帮助
收藏 0 赞 0 分享

flex实现股票行情走势图示例代码

股票行情走势图在flex中也可以实现了,具体步骤及代码如下,感兴趣的朋友可以参考下,或许有所帮助
收藏 0 赞 0 分享

flex实现DataGrid高亮显示数据功能的解决方案

原生的DataGrid根本无法达到所要的效果,目前一般就是来改写原生的DataGrid,只需重新写一个类来重写drawRowBackground方法就可以了
收藏 0 赞 0 分享

Flex中如何动态生成DataGrid以及动态生成表头

因某些需要,DataGrid及其表头需要动态生成,网上的解决方案打多笼统,下面有个不错的解决方法,感兴趣的朋友可以参考下
收藏 0 赞 0 分享

Flex中的HDividedBox和VDividedBox的比较附图

学习Flex的朋友对HDividedBox和VDividedBox并不陌生吧,下面是两者的简单比较,感兴趣的朋友可以参考下
收藏 0 赞 0 分享

Flex中AdvancedDataGrid的用法示例介绍

AdvancedDataGrid实现双表头表格,在某些情况下还是比较实用的,下面有个不错的示例,感兴趣的朋友可以参考下
收藏 0 赞 0 分享

FLEX给页面添加滚动条实现思路及代码

给页面添加滚动条的方法有很多,使用js获取浏览器窗口的宽高,根据浏览器窗口宽高修改样式,让滚动条出现,具体的实现如下,需要的朋友可以参考下
收藏 0 赞 0 分享

flex不显示GIF图片问题的另类解决方法

flex不显示GIF图片问题确实令人很头痛,不过我们可以用一些手段让其乖乖显示出来,具体的实现如下,需要的朋友可以参考下
收藏 0 赞 0 分享

flex中使用RadioButtonGroup时取出所选项的值的方法

flex中的RadioButtonGroup想必大家并不陌生吧,在本文将为大家介绍下在使用RadioButtonGroup时如何取出所选项的值,感兴趣的朋友可以参考下
收藏 0 赞 0 分享
查看更多