再用flex的jpegencoder对图片开展缩小的情况下,exif信息会遗失,也就是图片的创作者,用的照相机,甚么的,所有都没了,怎么办呢?

经科学研究jpeg的文本文档,最后处理这个问题
1.jpeg的格式文件,分为一个一个frame,每一个frame以0xFF开头,随后跟随一个标志未,例如0xFFD8表明文档的刚开始,0xFFD9表明文档完毕,随后标志位的是这一frame的长度,长度不包括0xFF和标志位,但包含这一两个字节数的长度,例如一个frame开始了,起先一个0xFF随后是一个0xXX,随后是2个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);
}