如何在Java中将TIF转换为PNG?

6

在Java中,将TIF文件转换为PNG的最佳方法是什么?

简单性是首选,但如果最简单的方法是使用第三方库,则可以考虑该解决方案。

5个回答

10

首先,安装JAI。然后安装JAI/ImageIO。然后执行:

public static void main(final String[] args) throws Exception
{
    final BufferedImage tif = ImageIO.read(new File("test.tif"));
    ImageIO.write(tif, "png", new File("test.png"));
}

2
如果您的平台支持本地代码,那么您也可以获取纯Java JAI,但没有理由这样做。如果您将应用程序部署到Web服务器,则服务器的JRE还必须安装JAI和JAI/ImageIO扩展。 - Jonathan Feinberg
安装程序会完成所有必要的操作,使其与您的JRE“即插即用”。 - Jonathan Feinberg
我还应该注意到,我正在使用http://www.exampledepot.com/egs/javax.imageio/DetermineFormat.html中提出的方法来检查TIF文件是否支持读取操作,根据canReadFormat()的结果,它们不支持。 - James McMahon
完整而简单的答案!!在搜索并尝试了5-6个不同的代码后,这个简单的小代码解决了我的问题。 <3 - elcool
1
不好意思打扰各位,JAI和JAI/ImageIO的下载链接在哪里? - Marsellus Wallace
显示剩余8条评论

7

使用imageMagic Java库,例如im4java,它们的性能和质量比JAI更好。

例如:

import org.im4java.core.ConvertCmd;
import org.im4java.core.IMOperation;

public static void convertTifToPng(File inputImage, File outputImage){
  IMOperation op = new IMOperation();
  op.addImage(); //place holder for input file
  op.addImage(); //place holder for output file

  ConvertCmd convert = new ConvertCmd();
  convert.run(op, new Object[]{inputImage.getAbsolutePath(), outputImage.getAbsolutePath()});
}

im4java的Maven依赖是

<dependency>
  <groupId>im4java</groupId>
  <artifactId>im4java</artifactId>
  <version>0.98.0</version>
</dependency>

1
我同意IM的质量非常好,但如果要在进程中使用它,我会非常紧张(因为在我看来,工程质量不好,可能会导致致命崩溃)。如果我要使用IM,我会选择使用ProcessBuilder来调用convert - Jonathan Feinberg
1
@giladbu:ImageMagick非常好,我按照Jonathan建议的方式进行操作,但我想评论一下“质量”部分:如果JAI读取有损TIFF(OP的TIFF是有损的),我非常怀疑JAI会产生比ImageMagick更差的图像质量。至于PNG,它是无损的,JAI在这方面不会出错。因此,在TIFF转换为PNG的情况下,我不认为ImageMagick的质量会比JAI更好。现在,如果是TIFF转换为JPG,那么我们将谈论完全不同的事情,我会毫不犹豫地使用ImageMagick。 - SyntaxT3rr0r
哦,我没意识到 PNG 是无损的。 - James McMahon
那么ImageMagic方法需要什么呢?安装ImageMagic命令行工具,然后将im4java JAR文件插入我的项目中? - James McMahon
1
im4java使用ProcessBuilder进行shell-out转换。 - Jeffrey Knight

1

下载JIMI软件开发工具包jimi1_0.zip,并将JimiProClasses.zip设置到您的类路径中

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-client-419417.html#7259-jimi_sdk-1.0-oth-JPR

JIMI是一款较老的Java图像库,但易于使用且没有平台相关代码(无本地可执行文件,可以像标准jar一样使用)。
import java.awt.Image;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;

import com.sun.jimi.core.Jimi;

public class JIMIImageConverter {

public static byte[] convert(byte[] inBytes, String inMimeType, String outMimeType) throws Exception{

    Image rawImage = Jimi.getImage(new ByteArrayInputStream(inBytes), inMimeType);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    Jimi.putImage(outMimeType, rawImage, outputStream);
    return outputStream.toByteArray();

}

}

其中inMimeType和outMimeType是图形格式的MIME类型


1
它可以很好地处理jpg、jpeg和png格式的文件,但无法处理tiff格式的文件。 - Mohammed Falha

1

是的,我看过了,老实说我不知道如何安装它。他们提供了一个下载ZIP文件,其中包含一个JAR文件和一个EXE文件。我以前从未见过这样的安装方式。 - James McMahon

0

也许你可以使用这段代码,对我来说很有效

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.IOException;

import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;

import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.SeekableStream;

public class ImageConvert {

    public static RenderedImage[] readMultiPageTiff(String fileName)throws IOException{
           File file = new File(fileName);
           SeekableStream seekableStream = new FileSeekableStream(file);
           ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", seekableStream, null);
           int numPages = decoder.getNumPages();
           RenderedImage image[]= new RenderedImage[numPages];
           int count = 0;
           for(int i=0;i<decoder.getNumPages();i++){
               image[i] = decoder.decodeAsRenderedImage(i);
               count++;
           }

           String newFolderName;
           String s3 = fileName;
           String [] temp = null;
           temp = s3.split("\\.");


           int j;
               j = 0;
               do{
                     newFolderName = temp[j];
                     String spoonFeeding = newFolderName;
                     File f = new File(spoonFeeding);
                     f.mkdirs();
                     j++;
               }while (j<1);

           for (int i = 0; i < count; i++) {
               RenderedImage page = decoder.decodeAsRenderedImage(i);
               File fileObj = new File(newFolderName+"/" + (i+1) + ".png");
               System.out.println("Saving " + fileObj.getCanonicalPath());
               ParameterBlock parBlock = new ParameterBlock();
               parBlock.addSource(page);
               parBlock.add(fileObj.toString());
               parBlock.add("png");
               RenderedOp renderedOp = JAI.create("filestore",parBlock);
               renderedOp.dispose();
           }
           return image;
        }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接