欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

flex压缩图片exif信息(作者/相机)丢失问题解决

程序员文章站 2022-03-07 18:50:07
在用flex的jpegencoder对图片进行压缩的时候,exif信息会丢失,也就是图片的作者,用的相机,神马的,全部都没有了,怎么办呢? 经研究jpeg的文档,最终解决这...
在用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);
}