2008-11-20 5 views
1

-Edit- FYI .. Я конвертирую b & w документы, отсканированные как оттенки серого или цвета.Преобразование PNG в bitonal TIFF

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», но я получаю сообщение об ошибке "Bits для каждого образца должно быть 1 для сжатия T6! »Любое предложение было бы оценено.

ответ

2

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

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

+1

Все это отсканированные документы. – CFreiner

0

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

У кого-то, похоже, та же проблема: HELP: how to compress the tiff. Решение задается в потоке (непроверенный!).