Flex压缩图片时exif信息丢失问题解决方法


Flex #exif2014-04-10 09:42
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的所有数据,代码如下: 

01//获取0xFFE1 app1也就是exif信息
02var tempData: ByteArray = new ByteArray();
03//这里的e.target.data是图片的原始byteArray
04tempData.writeBytes(e.target.data, 0, e.target.data.bytesAvailable);
05tempData.position = 3; //读取第四个字节
06var exif: Number = tempData.readUnsignedByte();
07if (exif == 0xE1) { //看这个字节是不是0xE1
08    this.Debug("有exif信息");
09    //读一个长度
10    var exifLength: Number = tempData.readUnsignedShort();
11    file_item.exifArray.writeBytes(tempData, tempData.position - 2, exifLength); //如果是,将exif信息读入一个文件对象
12} else if (exif == 0xE0) { //是e0,那么跳过这个frame,看下边
13    tempData.position = 4;
14    var e0Length: Number = tempData.readUnsignedShort();
15    tempData.position = 4 + e0Length; //跳过e0
16    tempData.position += 1; //跳过0xff
17    var isEx: Number = tempData.readUnsignedByte();
18    if (isEx == 0xE1) {
19        var len: Number = tempData.readUnsignedShort();
20        file_item.exifArray.writeBytes(tempData, tempData.position - 2, len);
21    }
22}
然后处理完了这些,我们就需要把这段frame给插到压缩之后的byteArray里 

01if (file_item.exifArray.length > 0) { //写入exif信息
02    var desData: ByteArray = new ByteArray();
03    desData.writeBytes(oldData, 0, 2); //0xffd8
04    desData.writeByte(0xff);
05    desData.writeByte(0xe1);
06    desData.writeBytes(file_item.exifArray, 0, file_item.exifArray.bytesAvailable);
07    desData.writeBytes(oldData, 2, oldData.bytesAvailable);
08    desData.position = 0;
09    this.uploadFileTest(desData, file_item);
10} else {
11    this.uploadFileTest(e.target.ba, file_item);
12}


相关文章

粤ICP备11097351号-1