我正在處理Android中的AR應用程序,它利用相機輸出。我正在處理一部分代碼以保存三個圖像文件:原始圖片,覆蓋屏幕和合成圖片,其中疊加了繪製(可能多餘,其他兩個)。我的相機的原始圖像尺寸是2592x1944。在Android中的位圖壓縮和速度優化
現在我的保存操作花費的時間比我想。我做的圖片使用的AsyncTask節省,但實際節省部分歸結爲以下幾點:
byte[] bitmapToByteArray(Bitmap b,Bitmap.CompressFormat fmt){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
b.compress(fmt, 100, baos);
return baos.toByteArray();
}
注:
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();
}
位圖轉換爲字節[]正在做所有的文件對象(例如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之間的差異了。
的RGB_565並創造約我提高了30%的那一步。然而,繪製在空白的畫布上並不會因爲某種原因保留圖像和覆蓋圖。 – jranalli
當您導出覆蓋圖時,也使用JPEG作爲壓縮格式。由於JPEG的壓縮可以由硬件輔助,而PNG壓縮是完全軟件操作。 –