[英]Bitmap Compression and Speed Optimization In Android
我正在处理Android中的AR应用程序,它使用相机输出。 我正在研究一部分代码来保存三个图像文件:原始图片,屏幕叠加和叠加绘制的复合图片(可能是多余的,给定其他两个)。 我相机的原始图像尺寸为2592x1944。
现在我的保存操作比我想要的时间更长。 我正在使用AsyncTask进行图片保存,但实际的保存部分归结为以下内容:
public void onPictureTaken(byte[] data, Camera camera){
Size sz = camera.getParameters().getPictureSize();
TimingLogger tl = new TimingLogger("CodeTiming", "Start Saving");
String fileName = getNameFromTime();
tl.addSplit("Start Pic Save");
// The Picture itself
ImageFile photo = new ImageFile(fileName+"_image.jpg");
photo.write(data);
tl.addSplit("Start Overlay Save");
// The overlay with blank background
Bitmap bmp = Bitmap.createBitmap(sz.width,sz.height,Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
DrawStuffOnCanvas(canvas);
ImageFile overlay = new ImageFile(fileName+"_overlay.png");
overlay.write(bitmapToByteArray(bmp,Bitmap.CompressFormat.PNG));
tl.addSplit("Start Overlay Onto Pic Save");
// The picture with the overlay drawn on
Options options = new Options();
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length, options);
picture = picture.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas2 = new Canvas(picture);
DrawStuffOnCanvas(canvas2);
ImageFile overlay2 = new ImageFile(fileName+"_combo.jpg");
overlay2.write(bitmapToByteArray(picture,Bitmap.CompressFormat.JPEG));
tl.addSplit("Start Metadata Save");
//Save picture metadata, not relevant to question
tl.addSplit("Done");
tl.dumpToLog();
}
将位图转换为byte []正在通过以下方式完成:
byte[] bitmapToByteArray(Bitmap b,Bitmap.CompressFormat fmt){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
b.compress(fmt, 100, baos);
return baos.toByteArray();
}
请注意,所有文件对象(例如ImageFile)都是自定义的,但所需的相关信息是它们使用FileOutputStream处理byte []的写入。 这是此次运行的最近计时转储。
Start Saving: begin
Start Saving: 4 ms, Start Pic Save
Start Saving: 86 ms, Start Overlay Save
Start Saving: 3576 ms, Start Overlay Onto Pic Save
Start Saving: 2066 ms, Start Metadata Save
Start Saving: 15 ms, Done
Start Saving: end, 5747 ms
有很多变化,每次保存大约5-15秒。 叠加(基本上是在屏幕上绘制的线条)当前被保存为透明度的PNG,并且由于JPEG压缩导致的锐利边缘处的伪像。 按照这个问题的逻辑,我看到如果我将叠加层切换为JPEG,我会把时间缩短一半。 正如您所看到的,我确实为复合图片实现了这一变化(锐利边缘已经被图像本身模糊),这在压缩步骤中节省了大约20秒。
所以我的问题是这个。 我可以做些什么来节省叠加压缩的时间,但保留PNG输出? 或者,或者,我在这里做的其他事情是浪费了大量时间来加速整体保存操作? 然后我就不用担心PNG与JPEG了。
戏剧性的加速机制:
使用RGB_565代替ARGB_8888,但可能(例如没有透明像素)
此外,“复制”操作比在“画布”上绘制“位图”花费更多时间。 您只需创建一个空位图并绘制原始图像即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.