Android, как изменить размер изображения в формате байтового массива - PullRequest
3 голосов
/ 28 октября 2011

У меня есть активность камеры.Моя деятельность будет снимать, а затем у меня есть AsyncTask, чтобы сохранить изображение на устройстве.Вот мой код:

class SavePhotoTask extends AsyncTask<byte[], String, String> {

    private ProgressDialog dialog;

    // protected Context applicationContext;

    @Override
    public void onPreExecute() {

        dialog = new ProgressDialog(CameraPreviewActivity.this);

        dialog.setMessage("gravando...");
        dialog.show();

    }

    @Override
    protected String doInBackground(byte[]... jpeg) {

        try {

            int i =jpeg[0].length;
            System.out.println("byte array size"+i);

            String timeStamp = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());

            Random generator2 = new Random(10000);
            int r=generator2.nextInt(99999);
            File cacheDir = getDir(DIRECTORIO, Context.MODE_PRIVATE);
            String filename = timeStamp+"-" +r+ ".jpg";
            File file = new File(cacheDir, filename);

            FileOutputStream stream = new FileOutputStream(file);
            //FileOutputStream fos = new FileOutputStream(photo.getPath());
            stream.write(jpeg[0]);
            stream.close();

            long t=file.length();
            System.out.println("file size"+t);
        } catch (java.io.IOException e) {
            Log.e("PictureDemo", "Exception in photoCallback", e);
        }

        return (null);
    }

    @Override
    protected void onPostExecute(String result) {
        this.dialog.cancel();

    }
}

(Этот класс является модификацией класса в книге CommonsWare (Расширенные разработки для Android)

Таким образом, SavePhotoTask получает изображение в формате байтового массива (байт []) и сохраняет его в файл. Я хотел бы изменить его размер (до 150 КБ), а затем сохранить его, если это возможно. Я знаю, что могу создать растровое изображение, но есть ли способ сжать байтовый массив напрямую? Или любой другой класс, который я мог бы использовать.

Это код для изменения размера растрового изображения:

Bitmap thumbnail=BitmapFactory.decodeByteArray(jpeg[0], 0, jpeg[0].length) 
thumbnail.compress(Bitmap.CompressFormat.JPEG, 100, stream);
        stream.close();
        long t=file.length();
        if(t>Constants.MAX_FILE_SIZE){
            stream = new FileOutputStream(file);
            thumbnail.compress(Bitmap.CompressFormat.JPEG, 75, stream);
            stream.close();
            t=file.length();
            int i=50;
            while(t>Constants.MAX_FILE_SIZE && i>=0){
                stream = new FileOutputStream(file);
                thumbnail.compress(Bitmap.CompressFormat.JPEG, i, stream);
                stream.close();
                i=i-5;
                t=file.length();
            }

        }

есть способ, которым я могу создать что-то лучше и, конечно, используя минимальные ресурсы памяти.большое спасибо

1 Ответ

0 голосов
/ 01 июля 2013

Может быть, я ошибаюсь, но я думаю, что вы не можете сжать уже сжатые данные в формате JPEG. Если вы будете сжимать уже сжатые данные, позже будет невозможно выполнить декодирование этих данных. Я думаю, вы должны подумать о изменении размера изображения. Вы можете увеличить ширину и высоту изображения, и это приведет к увеличению результирующего размера файла изображения.

...