2

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

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”类型,因为这似乎是我想要的,但我收到一个错误“T6 压缩每个样本的位数必须为 1!”任何建议将不胜感激。

4

2 回答 2

3

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

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

于 2008-11-20T15:14:32.860 回答
-2

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

有人似乎有同样的问题:帮助:如何压缩 tiff。线程上给出了解决方案(未经测试!)。

于 2008-11-20T17:04:04.200 回答