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