performance - Bitmap Compression and Speed Optimization In Android -


i'm dealing ar application in android draws on camera output. i'm working on portion of code save 3 image files: raw picture, screen overlay , composite picture overlay drawn on (possibly superfluous, given other two). native image size camera 2592x1944.

right save operation taking longer i'd like. i'm doing picture saving using asynctask, actual save part boils down following:

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");   // picture    imagefile photo = new imagefile(filename+"_image.jpg");   photo.write(data);    tl.addsplit("start overlay save");   // overlay 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");   // picture 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 question    tl.addsplit("done");   tl.dumptolog(); } 

converting bitmap byte[] being done by:

byte[] bitmaptobytearray(bitmap b,bitmap.compressformat fmt){   bytearrayoutputstream baos = new bytearrayoutputstream();   b.compress(fmt, 100, baos);   return baos.tobytearray(); } 

note of file objects (e.g. imagefile) custom, relevant information needed handle writing of byte[] using fileoutputstream. here's recent timing dump run.

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 

there's quite bit of variability, anywhere 5-15 seconds per save. overlay (essentially lines drawn on screen) being saved png transparency, , because of artifacts @ sharp line edges caused jpeg compression. following logic of this question, saw if switch overlay jpeg, cut time step in half. can see, did implement change composite picture (sharp edges blurred image itself), saved 20 seconds on compression step.

so question this. there can save time on compression of overlay, keep png output? or, alternatively, there else i'm doing here that's wasting lot of time speed overall save operation? wouldn't need worry png vs. jpeg quite much.

dramatic speed mechanism:

use rgb_565 instead of argb_8888 whereas possible (e.g. no transparent pixel)

also, "copy" operation takes more time drawing bitmap on canvas. can create empty bitmap , draw original image.


Comments

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -