My app uses the Camera to take high-res images, which are then jpeg 
compressed and sent over the network.  Initially I relied on the jpeg 
quality setting in the Camera API:

        final Camera.Parameters params = mCamera.getParameters();
        params.setPictureFormat(PixelFormat.JPEG);
        params.setJpegQuality(mQuality);
        mCamera.setParameters(params);

...but the results are highly inconsistent.  The size of the resulting jpeg 
file can vary by a factor of four, even when the scene, dimensions and jpeg 
quality are held constant.  I gather this is because the compression is 
performed in firmware and some devices do a better job than others.  As a 
workaround, I tried using Android's Bitmap classes to perform the 
compression in a way that would be consistent across devices:

    public static byte[] compress(byte[] data, CompressFormat format, int 
quality) {        
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final Bitmap bm = BitmapFactory.decodeByteArray(data, 0, 
data.length);
        try {
            bm.compress(format, quality, baos);
        } finally {
            bm.recycle();
        }
        return baos.toByteArray();
    }

When this works it works great, but it results in OutOfMemoryErrors when 
the dimensions are sufficiently large.  Certainly some of the resolutions 
supported by newer cameras are too large for this method to work reliably.  
So my questions are:

1. Is there a way to make the Camera API perform jpeg compression in a way 
that's consistent across devices?
2. If not, then are is there a way in which I can use the Bitmap classes 
differently so as to avoid or mitigate the OutOfMemoryErrors?
3. If not, then can anyone recommend a different method of achieving 
consistent jpeg compression (possibly via third-party jar)?  Something 
that's pure java and does byte[] -> byte[] conversion (without having to 
materialize the image in a intermediate form) would be ideal.

Thanks in advance.

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to