Android:从相机抓取图像并将其发送到服务器的高效方法

时间:2014-11-18 14:31:12

标签: android bitmap android-bitmap

我需要我的应用程序使用相机拍照,在我的活动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()将其写回文件系统......

f)因此,对于拍摄图像,调整大小,显示图像,然后将其发送到服务器的任务,我需要实际将其写入文件,然后读取它,然后再将其写入文件,然后读它 - 然后发送它? WTF?我没有更简单的方法吗?

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);

0 个答案:

没有答案