Как сохранить изображение JPEG на Android с настраиваемым уровнем качества
На Android как сохранить файл изображения в формате JPEG с качеством 30%?
В стандартной Java я бы использовал ImageIO
читать изображение как BufferedImage
затем сохраните его как файл JPEG, используя IIOImage
пример: http://www.universalwebservices.net/web-programming-resources/java/adjust-jpeg-image-compression-quality-when-saving-images-in-java. Похоже, однако, что Android не хватает javax.imageio
пакет.
4 ответа
Вы можете сохранить свое растровое изображение в формате JPEG, вызвав сжатие и установив второй параметр:
Bitmap bm2 = createBitmap();
OutputStream stream = new FileOutputStream("/sdcard/test.jpg");
/* Write bitmap to file using JPEG and 80% quality hint for JPEG. */
bm2.compress(CompressFormat.JPEG, 80, stream);
InputStream in = new FileInputStream(file);
try {
Bitmap bitmap = BitmapFactory.decodeStream(in);
File tmpFile = //...;
try {
OutputStream out = new FileOutputStream(tmpFile);
try {
if (bitmap.compress(CompressFormat.JPEG, 30, out)) {
{ File tmp = file; file = tmpFile; tmpFile = tmp; }
tmpFile.delete();
} else {
throw new Exception("Failed to save the image as a JPEG");
}
} finally {
out.close();
}
} catch (Throwable t) {
tmpFile.delete();
throw t;
}
} finally {
in.close();
}
@Phyrum Чай хорош только не забудь закрыть все
InputStream in = new FileInputStream(context.getFilesDir()+"image.jpg");
Bitmap bm2 = BitmapFactory.decodeStream(in);
OutputStream stream = new FileOutputStream(String.valueOf(context.getFilesDir()+pathImage+"/"+idPicture+".jpg"));
bm2.compress(Bitmap.CompressFormat.JPEG, 50, stream);
stream.close();
in.close();
Использование Kotlin для сохранения файла в path
в tmpPath
:
Files.newInputStream(path).use { inputStream ->
Files.newOutputStream(tmpPath).use { tmpOutputStream ->
BitmapFactory
.decodeStream(inputStream)
.compress(Bitmap.CompressFormat.JPEG, 30, tmpOutputStream)
}
}
Редактировать: убедитесь, что вы проверяете возможность сбоя декодирования (и возврата нуля), а также того, что сжатие действительно работает (логический тип возврата).
val success: Boolean = Files.newInputStream(path).use { inputStream ->
Files.newOutputStream(tmpPath).use { tmpOutputStream ->
BitmapFactory
.decodeStream(inputStream)
?.compress(Bitmap.CompressFormat.JPEG, config.qualityLevel, tmpOutputStream)
?: throw Exception("Failed to decode image")
}
}
if (!success) {
throw Exception("Failed to compress and save image")
}