【发布时间】:2014-03-24 21:03:55
【问题描述】:
我正在处理 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();
}
将 Bitmap 转换为 byte[] 正在通过以下方式完成:
byte[] bitmapToByteArray(Bitmap b,Bitmap.CompressFormat fmt){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
b.compress(fmt, 100, baos);
return baos.toByteArray();
}
请注意,所有文件对象(例如 ImageFile)都是自定义的,但所需的相关信息是它们使用 FileOutputStream 处理字节 [] 的写入。这是此运行的最近时间转储。
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 压缩导致的锐线边缘处的伪影。按照this question 的逻辑,我看到如果我将叠加层切换为JPEG,我将这一步的时间缩短了一半。如您所见,我确实为合成图片实现了该更改(锐边已经被图像本身模糊),在压缩步骤上节省了大约 20 秒。
所以我的问题是这样的。我可以做些什么来节省压缩叠加层的时间,但保留 PNG 输出?或者,或者,我在这里做的其他事情是否会浪费大量时间来加快整体保存操作?那么我就不需要担心 PNG 与 JPEG 的关系了。
【问题讨论】:
标签: android performance bitmap