繁体   English   中英

Android中的位图压缩和速度优化

[英]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了。

  1. PNG压缩比JPEG压缩慢得多,尤其是当您的位图大小很高时。
  2. 如果您不关心透明度,请使用RGB_565而不是ARGB_8888

更多信息: https//stackoverflow.com/a/33299613/4747587

戏剧性的加速机制:

使用RGB_565代替ARGB_8888,但可能(例如没有透明像素)

此外,“复制”操作比在“画布”上绘制“位图”花费更多时间。 您只需创建一个空位图并绘制原始图像即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM