如何在没有内存异常的情况下从"onPictureTaken"旋转图片?

Art*_*gin 5 android bitmap bitmapfactory

我在那里看过很多帖子?但我找不到正确答案.

我尝试做一些事情:

@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();
        ...
Run Code Online (Sandbox Code Playgroud)

有没有办法旋转图片,而不使用BitmapFactory?我想要旋转图片而不会损失质量!

CSm*_*ith 4

也许您可以使用 Camera.setDisplayOrientation 拍摄已经旋转的图片?检查Android 相机旋转。进一步研究 Camera.Parameters.setRotation()。其中一项技术应该可以满足您的需要。

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

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

  • 不幸的是,“setDisplayOrientaion()”仅适用于预览,不会影响“onPicturetaken()”中捕获的缓冲区。实际解决方案请参见http://stackoverflow.com/a/18447809/192373 (6认同)
  • setRotation 就是这样做的 - 旋转您在 onPictureTaken 中收到的实际图像。 (2认同)