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

Android 如何旋转图像并保存它而不重新压缩它?,android,jpeg,android-bitmap,image-compression,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(), ma

我有一个图像文件(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();

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


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


使用PNG而不是JPG。PNG格式是带有压缩的无损数据格式。


或者,您可以使用压缩程序库来使用WEBP格式。
WEBP支持无损和丢失


使用PNG而不是JPG。PNG格式是带有压缩的无损数据格式。


或者,您可以使用压缩程序库来使用WEBP格式。
WEBP支持无损和丢失



你试过什么了吗?你是怎么保存这个的?放一些代码,这样我们可以帮助你做得更好。是的,我想旋转图像,避免重新压缩它…你确定你不能只在图像的EXIF数据中设置旋转吗?这看起来像是在不改变数据的情况下旋转图像,但它是否适用于您取决于您旋转图像的原因以及随后将显示图像的内容。(请注意,这并不像一些人认为的那样奇怪:可以通过算法旋转JPEG而不进行有损重新压缩:,我猜这就是我们要讨论的。)你试过什么了吗?你是如何保存此文件的?请输入一些代码以便我们可以更好地帮助你的?是的,我想旋转图像并避免重新压缩它…你确定不能在图像的EXIF数据中设置旋转吗?这看起来会旋转图像而不更改数据,但它是否适用于你取决于旋转的原因请注意,这并不像一些人认为的那样是一个奇怪的问题:可以通过算法旋转JPEG而无需有损重新压缩:,我猜这就是我们正在讨论的问题否,png将增加原始文件的3倍大小+保存文件大约需要7秒:(WebP是一个很好的替代品,但为什么WebP的质量是75,而不是80?90?95?@noa WebP的质量是100。我只是从github网站复制并粘贴了一个示例,并对其进行了更正。@noa此外,使用WebP需要API 14或更高版本。@noa为什么需要旋转图像?如果需要从相机旋转图像,可以“设置显示方向”(90)“不需要自己旋转。不,png将增加原始文件的3倍大小+保存文件大约需要7秒:(WebP是一个很好的替代品,但为什么WebP的质量是75,而不是80?90?95?@noa WebP的质量是100。我只是从github网站复制并粘贴了一个示例,并对其进行了更正。@noa此外,使用WebP需要API 14或更高版本。@noa为什么需要旋转图像?如果需要从相机旋转图像,可以“设置显示方向”(90)“无需自行旋转。
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();
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();
compressedImage = new Compressor(this)
        .setMaxWidth(640)
        .setMaxHeight(480)
        .setQuality(100)
        .setCompressFormat(Bitmap.CompressFormat.WEBP)
        .setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory(
          Environment.DIRECTORY_PICTURES).getAbsolutePath())
        .compressToFile(actualImage);