How to compress photo taken by Camera.takepicture


December 2018


2.7k time


I'm developing an app where the user has the ability to take a picture through my CameraActivity (SurfaceView+Camera) and save it. After that the bitmap will be processed.

Said that let me walk you through details. The picture is taken with:

mCamera.takePicture(null, null, new PictureCallback() {...}

I'm not specifying .jpeg quality.
Testing with HTC One S, the picture is taken and then saved. The picture size never exceeds 100kb
Testing with Samsung GT-I9000, the picture is taken and then saved but the difference here is the size, it exceeds 1,2Mb.

Since I'll need to process the bitmap latter on I'm having some OutOfMemory issues with the GT-I9000 when I try to decode the bimap to process it:

try {
    FileInputStream fis = new FileInputStream(new File(imagePath));
    Bitmap savedPicture = BitmapFactory.decodeStream(fis);

I've tried to change Camera Parameters .setJpegQuality(quality) but I it didn't made a huge difference.

The image will occupy all the screen size and I used this approach Loading Large Bitmaps Efficiently It worked, I got rid of OutOfMemory Exceptions but still I've some questions:

  1. File size differences between devices? I assume HTC One S is better than GT-I9000 so why doesn't save bigger pictures?

  2. Image resolution, HTC One S 640x480, GT-I9000 2560x1920 why? Well this answer the first question, but why is this happening?

Thanks for your time ;)

1 answers


Ваша проблема не со сжатием изображения, но с разрешением, то есть размер. Различные Android устройства имеют разные размеры по умолчанию Picture. Но , к счастью, у вас есть Camera.Parameters.setPictureSize (ширина Int, Int высота) метод. Вы можете установить размер в любое время , прежде чем звонить Camera.takePicture () , как это:

Camera.Parameters param = mCamera.getParameters();
param.setPictureSize(640, 480);

Обратите внимание, что различные Android устройства поддерживают различные размеры изображения тоже. Т.е. вы не можете установить произвольный размер, вы должны выбрать один из списка конкретного к устройству. Существует метод Camera.Parameters.getSupportedPictureSizes ().

Обратите внимание, что поддерживаемые размеры изображения на одном устройстве различны для двух камер (если устройство имеет Фронтальная камеру и заднюю фронтальную камеру). Откройте правильную камеру, прежде чем начать запросы и наборы.

Наконец, я должен признаться, что все устройства я когда-либо слышал о, все поддерживается 640х480 размера изображения.