如何旋转图像并保存而不重新压缩?

时间:2017-09-28 07:36:13

标签: android jpeg android-bitmap image-compression

我有一个图像文件(jpg),我需要旋转它。但是,我想避免在将其保存回磁盘时重新压缩它。他们有办法做到这一点吗?

我保存了这样的图像:

  matrix.setRotate(-90);
  Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
  Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
  bitmap.recycle();

  FileOutputStream fileoutputstream = new FileOutputStream(imagePath);
  bmRotated.compress(CompressFormat.JPEG, 100, fileoutputstream);
  fileoutputstream.flush();
   fileoutputstream.close();
  bmRotated.recycle();

2 个答案:

答案 0 :(得分:0)

也许您可以尝试将位图中的数据提取到字节数组并保存该数组。 (代码未经过测试,可能不起作用)。

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

int size = bitmap.getRowBytes() * bitmap.getHeight();
ByteBuffer byteBuffer = ByteBuffer.allocate(size);
bitmap.copyPixelsToBuffer(byteBuffer);
byte[] byteArray = byteBuffer.array();

FileOutputStream output = new FileOutputStream("filename");
output.write(byteArray);
output.close();

答案 1 :(得分:0)

使用PNG代替JPG。 PNG格式是带有压缩的无损数据格式。 https://en.wikipedia.org/wiki/Portable_Network_Graphics

matrix.setRotate(-90);
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options);
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, 
bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();

FileOutputStream fileoutputstream = new FileOutputStream(imagePath);
bmRotated.compress(CompressFormat.PNG, 100, fileoutputstream);
fileoutputstream.flush();
fileoutputstream.close();
bmRotated.recycle();


或者,您可以使用Compressor库来使用WEBP格式 WEBP支持无损和丢失。 https://en.wikipedia.org/wiki/WebP

https://github.com/zetbaitsu/Compressor

compressedImage = new Compressor(this)
        .setMaxWidth(640)
        .setMaxHeight(480)
        .setQuality(100)
        .setCompressFormat(Bitmap.CompressFormat.WEBP)
        .setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory(
          Environment.DIRECTORY_PICTURES).getAbsolutePath())
        .compressToFile(actualImage);