Я хочу сжать файл jpg, если он больше 1 МБ или 1 МБ или немного меньше.
Качество сжатия параметров от 0,0f до 1,0f в setCompressionQuality
в ImageWriteParam
четко не определено.
Качество = 0,5f может сжать изображение 5 раз, 7 раз, 1,2 раза зависит от изображения. Не в 2 раза, как все ожидали.
Итак, как я могу выбрать размер сжатия изображения? Может быть, есть какие-нибудь библиотеки с открытым исходным кодом?
UPD:
Пример сжатия:
public static byte[] write(BufferedImage image, String formatName, int dpi, float quality) {
try(ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
ImageIOUtil.writeImage(image, formatName, outputStream, dpi, quality);
return outputStream.toByteArray();
} catch (IOException ex) {
return null;
}
}
public static void main(String[] args) {
BufferedImage bufImg = null;
try
{
bufImg = ImageIO.read(new File("myfile"));
} catch (IOException e){e.printStackTrace();}
for(int i = 0; i < 10; i++) {
byte[] arr = write(bufImg, "jpg", 300, 0.1f*i);
double fl = (double)arr.length/(double)MY_FILE_SIZE_BYTES;
System.out.println(fl + " " + (0.1f*i));
}
}
Я использую org.apache.pdfbox.tools.imageio.ImageIOUtil
для этого, ImageIOUtil использует ImageWriter и ImageWriteParam внутри.