将PNG转换为双色调TIFF

时间:2008-11-20 14:56:08

标签: java image-manipulation javax.imageio

CNC中 仅供参考。我正在转换以灰度或彩色扫描的b& w文件。

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

有没有人与其他图书馆一起免费或付费处理图像处理?

-Original- 我正在尝试使用Java ImageIO将PNG转换为双色调TIFF。有没有人有这样的运气?我有它从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 个答案:

答案 0 :(得分:3)

最有可能的是,在使用CCITT压缩保存为TIFF之前,您希望将this之类的内容转换为1位。

稍微阐述一下 - 请注意,从其他位深度转换为1位非常重要。您正在进行数据缩减操作,并且存在许多特定于域的解决方案,这些解决方案在输出质量(盲阈值,自适应阈值,抖动,本地阈值,全局阈值等)方面差异很大。他们都不是特别擅长所有图像类型(自适应阈值对于文档非常好,但对于照片来说很糟糕)。

答案 1 :(得分:-2)

正如基座所说,你必须进行转换,Java不会为你神奇地做到这一点...... 如果PNG图像已经是黑色&白色(看起来,看着你的评论),使用阈值可能是最好的解决方案。

似乎有人遇到同样的问题:HELP: how to compress the tiff。在线程上给出了一个解决方案(未经测试!)。