加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flex压缩图片的时候如何保证exif信息不丢失

发布时间:2020-12-15 04:29:07 所属栏目:百科 来源:网络整理
导读:在用flex的jpegencoder对图片进行压缩的时候,exif信息会丢失,也就是图片的作者,用的相机,神马的,全部都没有了,怎么办呢? ? 经研究jpeg的文档,最终解决这个问题 1.jpeg的文件格式,分成一个一个frame,每个frame以0xFF打头,然后跟着一个标识未,比如

在用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,sans-serif; font-size:14px; line-height:22px"> 所以在把这个byteArray在如到图片对象之前,先要获取到这个0xE1的frame的所有数据,代码如下:

? ? ????????????????//获取0xFFE1 app1也就是exif信息

? ? ? ? ? ? ? ? ? ? var tempData:ByteArray = new ByteArray();

????????????????? ? //这里的e.target.data是图片的原始byteArray

? ? ? ? ? ? ? ? ? ? tempData.writeBytes(e.target.data,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,len);

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }?

然后处理完了这些,我们就需要把这段frame给插到压缩之后的byteArray里

代码的逻辑应该一目了然的,嘿嘿

????????????????????if(file_item.exifArray.length>0) { //写入exif信息

? ? ? ? ? ? ? ? ? ? ? ? ? ? var desData:ByteArray = new ByteArray();

? ? ? ? ? ? ? ? ? ? ? ? ? ? desData.writeBytes(oldData,2);//0xffd8

? ? ? ? ? ? ? ? ? ? ? ? ? ? desData.writeByte(0xff);

? ? ? ? ? ? ? ? ? ? ? ? ? ? desData.writeByte(0xe1);

? ? ? ? ? ? ? ? ? ? ? ? ? ? desData.writeBytes(file_item.exifArray,file_item.exifArray.bytesAvailable);

? ? ? ? ? ? ? ? ? ? ? ? ? ? desData.position = 0;

? ? ? ? ? ? ? ? ? ? ? ? ? ? this.uploadFileTest(desData,file_item);

? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? } else {

? ? ? ? ? ? ? ? ? ? ? ? ? ? this.uploadFileTest(e.target.ba,sans-serif; font-size:14px; line-height:22px"> ? ? ? ? ? ? ? ? ? ? ? ? }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读