Java Android - JPEG图像旋转

时间:2018-03-15 16:50:38

标签: java android matrix android-camera2

我正在处理捕获图像的应用程序,但我想在保存之前旋转JPEG图像,我已经看到了这个链接:  Android Rotate Picture before saving

这就是我现在正在做的事情。

ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);

FileOutputStream fileOutputStream = null;

try {
    fileOutputStream = new FileOutputStream(mImageFileName);
    fileOutputStream.write(bytes);
} catch (IOException e) {
    e.printStackTrace();
}


我尝试这样旋转图像:

// Bytes array to bitmap and matrix rotation
Bitmap sourceBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Matrix m = new Matrix();
m.setRotate((float)90, sourceBitmap.getWidth(), sourceBitmap.getHeight());
Bitmap targetBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), m, true);

// Bitmap to bytes array
int size = targetBitmap.getRowBytes() * targetBitmap.getHeight();
ByteBuffer targetByteBuffer = ByteBuffer.allocate(size);
targetBitmap.copyPixelsToBuffer(targetByteBuffer);
bytes = targetByteBuffer.array();

但当我将文件放入我的画廊时,我无法阅读它,图像似乎已经破碎了。

编辑:不适用于Android 7.1.1:/任何想法?我可以为视频记录做类似的事吗?

2 个答案:

答案 0 :(得分:2)

您正在将Bitmap转换为bytes array, 现在,您停止将Bitmap直接保存到File

Bitmap sourceBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Matrix m = new Matrix();
m.setRotate((float)90, sourceBitmap.getWidth(), sourceBitmap.getHeight());
Bitmap rotatedBitmap= Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), m, true);

// Save Bitmap directly to the file

String filename = "hello.jpg";
File sd = Environment.getExternalStorageDirectory();
File dest = new File(sd, filename);

try {
     FileOutputStream out = new FileOutputStream(dest);
     bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
     out.flush();
     out.close();
    } catch (Exception e) {
     e.printStackTrace();
    }

答案 1 :(得分:0)

这个小小的改变显然已经成功了!谢谢Nikunj!

ByteBuffer byteBuffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[byteBuffer.remaining()];
byteBuffer.get(bytes);

Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Matrix matrix = new Matrix();
matrix.setRotate((float)90, bitmap.getWidth(), bitmap.getHeight());

FileOutputStream fileOutputStream = null;
try {
    fileOutputStream = new FileOutputStream(mImageFileName);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
    fileOutputStream.flush();
    fileOutputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}