Java 将PNG转换为双音TIFF

Java 将PNG转换为双音TIFF,java,image-manipulation,javax.imageio,Java,Image Manipulation,Javax.imageio,-编辑- 仅供参考。。我正在将扫描的黑白文件转换为灰度或彩色 1) 第一个解决方案成功了,它只是颠倒了黑白(黑色背景,白色文本)。这也花了将近10分钟。 2) 第二个答案中的JAI解决方案对我不起作用。我在这里发帖之前试过了 是否有人与其他免费或付费的图书馆合作,处理好图像处理 -原创的- 我正在尝试使用Java ImageIO将PNG转换为双音TIFF。有谁有幸做到这一点吗?我已经把它从PNG转换成TIFF。我不确定是否需要转换我在TIFF中读取的BuffereImage(PNG)或在写入时在

-编辑- 仅供参考。。我正在将扫描的黑白文件转换为灰度或彩色

1) 第一个解决方案成功了,它只是颠倒了黑白(黑色背景,白色文本)。这也花了将近10分钟。
2) 第二个答案中的JAI解决方案对我不起作用。我在这里发帖之前试过了

是否有人与其他免费或付费的图书馆合作,处理好图像处理

-原创的- 我正在尝试使用Java ImageIO将PNG转换为双音TIFF。有谁有幸做到这一点吗?我已经把它从PNG转换成TIFF。我不确定是否需要转换我在TIFF中读取的BuffereImage(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.6”,因为这似乎是我想要的,但我得到一个错误“T6压缩的每个样本的比特数必须为1!”任何建议都将不胜感激

最有可能的情况是,在使用CCITT压缩保存到TIFF之前,您需要转换为1位


稍微解释一下-请注意,从其他位深度转换为1位并非易事。您正在执行数据缩减操作,有几十种特定于领域的解决方案,它们在输出质量上差异很大(盲阈值、自适应阈值、抖动、局部阈值、全局阈值等)。它们中没有一个在所有图像类型上都特别出色(例如,自适应阈值对于文档来说非常好,但是对于照片来说却很糟糕)。

正如普林斯所说,您必须进行转换,Java不会神奇地为您做这件事。。。 如果PNG图像已经是黑白的(看起来,看你的评论),使用阈值可能是最好的解决方案


有些人似乎也有同样的问题:。线程上给出了解决方案(未测试!)。

所有这些都是扫描文档。