Android如何以字节数组格式调整图像大小

时间:2011-10-28 11:00:21

标签: android image compression bytearray

我有相机活动。我的活动将拍照,然后我有一个AsyncTask将pic保存到设备。这是我的代码:

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以字节数组格式(byte [])接收图像并将其保存在文件中。 我想做的是调整它(150K以下)然后保存它,如果可能的话。我知道我可以创建一个位图,但有没有办法直接压缩字节数组?或者我可以使用的任何其他课程。

这是调整位图大小的代码:

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 :(得分:0)

可能是我错了,但我认为你无法压缩JPEG格式的已压缩数据。如果您将压缩已经压缩的数据,稍后将无法解码这些数据。 我认为你应该考虑图像重新调整大小。您可以增加图像的宽度和高度,这会增加图像文件的大小。