无法使用Java ImageIO标准库读取和写入TIFF图像文件

Gle*_*Gle 22 java tiff javax.imageio

我不知道如何处理TIFF图像,但我无法使用直接Java标准ImageIO库来读取或写入任何图像.有什么想法吗?

谢谢.

har*_*ldK 13

如果您因为任何原因不喜欢或不能使用JAI,我已经为ImageIO编写了一个TIFF ImageReader插件,可以在GitHub找到.它是纯Java,不需要任何本机安装,并且带有非常友好的开源许可证(BSD).

它支持任何基线TIFF选项,以及许多标准扩展.从版本3.1开始,TIFF插件也具有写入支持.

使用类路径中的正确JAR,用法可以简单到:

BufferedImage image = ImageIO.read(inputTIFF);
// ...modify image (compose, resize, sharpen, etc)...
ImageIO.write(image, "TIFF", outputTIFF);
Run Code Online (Sandbox Code Playgroud)


小智 5

我尝试过 JAI,但它对我不起作用。

你被困在哪里了?以下内容对您有用吗?

import java.io.File;
import java.io.FileOutputStream;
import java.awt.image.RenderedImage;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import javax.media.jai.NullOpImage;
import javax.media.jai.OpImage;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.TIFFDecodeParam;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageCodec;

public class Main {
    public static void main(String args[]) {
        File file = new File("input.tif");
        try {
            SeekableStream s = new FileSeekableStream(file);
            TIFFDecodeParam param = null;
            ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param);
            RenderedImage op = new NullOpImage(dec.decodeAsRenderedImage(0),
                                               null,
                                               OpImage.OP_IO_BOUND,
                                               null);
            FileOutputStream fos = new FileOutputStream("output.jpg");
            JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
            jpeg.encode(op.getData());
            fos.close();
        }
        catch (java.io.IOException ioe) {
            System.out.println(ioe);
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一旦你的类路径中有 jai_imageio.jar,你就可以正常使用 ImageIO API (4认同)

har*_*ldK 5

根据JEP 262:TIFF Image I / O,从Java 9开始,以前是JAI一部分的TIFF插件将作为Java SE的一部分提供。

这意味着,使用Java 9或更高版本,以下代码将可以正常工作,而无需任何额外的导入或依赖:

BufferedImage image = ImageIO.read(inputTIFF);
// ...modify image (compose, resize, sharpen, etc)...
ImageIO.write(image, "TIFF", outputTIFF);
Run Code Online (Sandbox Code Playgroud)

我尚未能够在此插件中验证对非基准TIFF风格的支持,但我认为至少应完全支持基准TIFF。