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的所有数据,代码如下:
02 | var tempData: ByteArray = new ByteArray(); |
04 | tempData.writeBytes(e.target.data, 0 , e.target.data.bytesAvailable); |
06 | var exif: Number = tempData.readUnsignedByte(); |
08 | this .Debug( "有exif信息" ); |
10 | var exifLength: Number = tempData.readUnsignedShort(); |
11 | file_item.exifArray.writeBytes(tempData, tempData.position - 2 , exifLength); |
12 | } else if (exif == 0xE0 ) { |
13 | tempData.position = 4 ; |
14 | var e0Length: Number = tempData.readUnsignedShort(); |
15 | tempData.position = 4 + e0Length; |
16 | tempData.position += 1 ; |
17 | var isEx: Number = tempData.readUnsignedByte(); |
19 | var len: Number = tempData.readUnsignedShort(); |
20 | file_item.exifArray.writeBytes(tempData, tempData.position - 2 , len); |
然后处理完了这些,我们就需要把这段frame给插到压缩之后的byteArray里
01 | if (file_item.exifArray.length > 0 ) { |
02 | var desData: ByteArray = new ByteArray(); |
03 | desData.writeBytes(oldData, 0 , 2 ); |
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); |
09 | this .uploadFileTest(desData, file_item); |
11 | this .uploadFileTest(e.target.ba, file_item); |
相关文章