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

在用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);

                        }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值