2014-03-24 63 views
6

我正在處理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之間的差異了。

回答

5

戲劇加速機構:

使用RGB_565代替ARGB_8888而可能的(例如沒有透明像素)

另外,「複製」操作花費比繪製在畫布上該位圖更多的時間。您可以簡單地創建一個空位圖並繪製原始圖像。

+0

的RGB_565並創造約我提高了30%的那一步。然而,繪製在空白的畫布上並不會因爲某種原因保留圖像和覆蓋圖。 – jranalli

+0

當您導出覆蓋圖時,也使用JPEG作爲壓縮格式。由於JPEG的壓縮可以由硬件輔助,而PNG壓縮是完全軟件操作。 –