Конвертировать PNG в битовый формат TIFF - PullRequest
2 голосов
/ 20 ноября 2008

-Edit- К вашему сведению ... Я конвертирую черно-белые документы, отсканированные в оттенки серого или цветные.

1) Первое решение сработало, оно поменял местами черно-белое изображение (черный фон, белый текст). Это также заняло почти 10 минут.
2) Решение JAI во втором ответе не сработало для меня. Я попробовал это прежде, чем отправлять здесь.

Кто-нибудь работал с другими библиотеками бесплатно или хорошо платил за обработку изображений?

-Original- Я пытаюсь преобразовать PNG в битовый TIFF с помощью Java ImageIO. Кому-нибудь повезло с этим? Я получил его для преобразования из PNG в TIFF. Я не уверен, нужно ли мне преобразовывать BufferedImage (PNG), который я читаю, или конвертировать в TIFF, когда я пишу его. Я искал и искал, но ничего не работает? У кого-нибудь есть предложения, где искать?

Вот код, который преобразует ...

public static void test() throws IOException {

    String fileName = "4848970_1";
    // String fileName = "color";
    String inFileType = ".PNG";
    String outFileType = ".TIFF";

    File fInputFile = new File("I:/HPF/UU/" + fileName + inFileType);
    InputStream fis = new BufferedInputStream(new FileInputStream(fInputFile));
    ImageReaderSpi spi = new PNGImageReaderSpi();
    ImageReader reader = spi.createReaderInstance();
    ImageInputStream iis = ImageIO.createImageInputStream(fis);
    reader.setInput(iis, true);
    BufferedImage bi = reader.read(0);

    int[] xi = bi.getSampleModel().getSampleSize();

    for (int i : xi) {
        System.out.println("bitsize " + i);
    }

    ImageWriterSpi tiffspi = new TIFFImageWriterSpi();
    TIFFImageWriter writer = (TIFFImageWriter) tiffspi.createWriterInstance();

    // TIFFImageWriteParam param = (TIFFImageWriteParam) writer.getDefaultWriteParam();
    TIFFImageWriteParam param = new TIFFImageWriteParam(Locale.US);
    String[] strings = param.getCompressionTypes();
    for (String string : strings) {
        System.out.println(string);
    }

    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionType("LZW");

    File fOutputFile = new File("I:\\HPF\\UU\\" + fileName + outFileType);
    OutputStream fos = new BufferedOutputStream(new FileOutputStream(fOutputFile));
    ImageOutputStream ios = ImageIO.createImageOutputStream(fos);

    writer.setOutput(ios);
    writer.write(null, new IIOImage(bi, null, null), param);

    ios.flush();
    writer.dispose();
    ios.close();

}

Я попытался изменить сжатие на тип "CCITT T.6", так как это, кажется, то, что я хочу, но я получаю ошибку "Биты на выборку должны быть 1 для сжатия T6!" Любое предложение будет оценено.

Ответы [ 2 ]

3 голосов
/ 20 ноября 2008

Скорее всего, вы хотите что-то вроде this преобразовать в 1 бит перед сохранением в TIFF со сжатием CCITT.

Чтобы изложить немного - помните, что преобразование из других битовых глубин в 1 бит нетривиально. Вы выполняете операцию сокращения данных, и существуют десятки решений для конкретных областей, которые сильно различаются по качеству вывода (слепой порог, адаптивный порог, дизеринг, локальный порог, глобальный порог и т. Д.). Ни один из них не особенно хорош для всех типов изображений (адаптивный порог довольно хорош для документов, но паршив для фотографий, например).

0 голосов
/ 20 ноября 2008

Как сказал плинтус, вы должны сделать преобразование, Java не сделает это волшебным образом для вас ... Если изображение в формате PNG уже черно-белое (кажется, глядя на ваш комментарий), возможно, лучшим решением будет использование порога.

У кого-то, похоже, такая же проблема: ПОМОЩЬ: как сжать tiff . Решение дается в потоке (не проверено!).

...