Сжатие и преобразование JPG в TIFF в Java - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть изображение jpg, и я хочу преобразовать его в файл формата tiff, но когда я создаю выходной файл из byteArrayOutputStream, выходной файл имеет длину 0 байт.

public static void main(String[] args) throws Exception {
    String root = "E:\\Temp\\imaging\\test\\";

    File image = new File(root + "0riginalTif-convertedToJpg.JPG");

    byte[] bytes = compressJpgToTiff(image);
    File destination = new File(root + "OriginalJpg-compressedToTiff.tiff");
    FileOutputStream fileOutputStream = new FileOutputStream(destination);
    fileOutputStream.write(bytes);
}


public static byte[] compressJpgToTiff(File imageFile) throws Exception {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(255);
    ImageOutputStream imageOutputStream = null;
    try {
        File input = new File(imageFile.getAbsolutePath());

        Iterator<ImageWriter> imageWriterIterator = ImageIO.getImageWritersByFormatName("TIF");
        ImageWriter writer = imageWriterIterator.next();
        imageOutputStream = ImageIO.createImageOutputStream(byteArrayOutputStream);
        writer.setOutput(imageOutputStream);

        ImageWriteParam param = writer.getDefaultWriteParam();
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionType("JPEG");
        param.setCompressionQuality(0.1f);

        BufferedImage bufferedImage = ImageIO.read(input);
        writer.write(null, new IIOImage(bufferedImage, null, null), param);
        writer.dispose();
        return byteArrayOutputStream.toByteArray();

    } catch (Exception e) {

        throw new RuntimeException(e);
    } finally {
        if (imageOutputStream != null)
            imageOutputStream.close();
        byteArrayOutputStream.close();
    }
}

Я хочу максимально уменьшить размер вывода tiff. Есть ли лучший подход? Можно ли вообще уменьшить размер изображения tiff?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Ваш byteArrayOutputStream объект закрывается в блоке finally перед преобразованием byteArrayOutputStream в byteArray с использованием byteArrayOutputStream.toByteArray(), поэтому вы получаете длину контента равной 0 . Поэтому измените ваш код один раз, как показано ниже:

public static byte[] compressJpgToTiff(File imageFile) throws Exception {
//Add rest of your method code here
writer.dispose();
byte[] bytesToReturn = byteArrayOutputStream.toByteArray();
return bytesToReturn;
} catch (Exception e) {
    throw new RuntimeException(e);
} finally {
    if (imageOutputStream != null)
        imageOutputStream.close();
    byteArrayOutputStream.close();
}
}
0 голосов
/ 19 ноября 2018

return byteArrayOutputStream.toByteArray();, но вы не записали данные в byteArrayOutputStream. Смотри, ты только что добавил данные в writer.

Что касается сжатия файла TIFF, вы уже сделали это с - param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

...