2012-08-09 73 views
5

我看过很多文章吗?但我找不到正确的答案。如何从“onPictureTaken”旋转图片而不会出现内存不足异常?

我尝试做一些这样的:

@Override 
public void onPictureTaken(byte[] paramArrayOfByte, Camera paramCamera) { 
    try { 


     Bitmap bitmap = BitmapFactory.decodeByteArray(paramArrayOfByte, 0, 
     paramArrayOfByte.length); 

     int width = bitmap.getWidth(); 
     int height = bitmap.getHeight(); 

     FileOutputStream os = new ileOutputStream(Singleton.mPushFilePath); 

     Matrix matrix = new Matrix(); 
     matrix.postRotate(90); 
     Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, 
      height, matrix, false); 

     resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 95, os); 
     os.close(); 
     ... 

有没有办法可以旋转图片,而无需使用BitmapFactory?我想旋转图片而不损失质量!

+0

这里有一个很好的解决方案:http://stackoverflow.com/questions/2225363/c-sharp-rotate-bitmap-90-degrees – paul 2012-08-09 12:46:19

+0

这是伟大的,但它的C#? – 2012-08-09 12:50:34

+0

对不起 - 没有阅读标签! – paul 2012-08-09 13:00:37

回答

4

也许你可以用你想使用Camera.setDisplayOrientation旋转的图像?检查Android camera rotate。此外,调查Camera.Parameters.setRotation()。其中一种技巧应该为你做好准备。

否则你的代码看起来很好,除了在Bitmap.compress上使用参数95,你需要使用100来进行无损压缩。

要避免内存不足异常,请使用Camera.Parameters.setPictureSize()获取较低分辨率的图片(例如3Mpx)。即你真的需要一张8Mpx的照片吗?确保使用Camera.Parameters.getSupportedPictureSizes()来确定设备上支持的尺寸。

+5

不幸的是,'setDisplayOrientaion()'仅适用于预览,并且不影响在'onPicturetaken()'中捕获的缓冲区。有关实际解决方案,请参阅http://stackoverflow.com/a/18447809/192373 – 2014-04-05 13:07:24

+2

setRotation就是这样做的 - 旋转您在onPictureTaken中收到的实际图像。 – slott 2015-05-19 06:38:14