我需要我的应用程序使用相机拍照,在我的活动ImageView
中显示,然后使用HttpClient将其发送到服务器。到现在为止还挺好。不幸的是,我偶然发现了MemoryOutOfBoundsException
。所以我想用JPG或PNG压缩我的图像。
现在 - 经过一些过度的谷歌搜索 - 我做对了吗
a)摄像机将始终输出未压缩的Bitmap
,直接写入文件系统。即像这样:
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
this.imageTempFile = new File(android.os.Environment.getExternalStorageDirectory(), "myTempFileName"); // write the camera output to a tmpFile
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(this.imageTempFile)); // link the tmpFile to a member for convenience later on
startActivityForResult(cameraIntent, CAMERA_REQUEST);
所以没有办法立即调整/压缩它?
b)如果我想在ImageView
中显示图像,我需要使用ImageView.setImageBitmap(Bitmap bm)
将位图传递给它。因此显示结果非常耗费内存......!
c)如果我想改变Bitmap(调整大小/压缩),我需要使用BitmapFactory
d)现在我可以使用Bitmap.createScaledBitmap()
e)但是如果我想压缩图像,我需要使用OutputStream
通过Bitmap.compress()
将其写回文件系统......
PS:这是我的b)到e)的代码:
// c) read the Bitmap from file
Bitmap bitmap;
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeFile(this.imageTempFile.getAbsolutePath(), bitmapOptions);
// d) do some resizing
bitmap = Bitmap.createScaledBitmap(bitmap, (int) mywidth, (int) myheight, true);
// e) compress
OutputStream out = new ByteArrayOutputStream(50);
this.imageTempFile.delete();
File file = new File(this.imageTempFile.getAbsolutePath());
try {
out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 85, out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// NOW we could read it again from the file to send it afterwards...
Bitmap newBitmap = BitmapFactory.decodeFile(this.imageTempFile.getAbsolutePath(), bitmapOptions);