【问题标题】:How do I convert a TIF to PNG in Java?如何在 Java 中将 TIF 转换为 PNG?
【发布时间】:2011-01-18 11:32:14
【问题描述】:

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

简单是可取的,但如果最简单的方法是使用第三方库,那么我会考虑该解决方案。

【问题讨论】:

    标签: java image png tiff image-conversion


    【解决方案1】:

    Java 高级成像 APi 是一个很好的图像处理库

    http://java.sun.com/products/java-media/jai/iio.html

    【讨论】:

    • 是的,我在看,我真的不知道如何安装它。他们有一个下载 ZIP,其中包含一个 JAR 文件,其中包含一个 EXE 文件。我以前从未见过。
    【解决方案2】:

    首先,安装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"));
    }
    

    【讨论】:

    • 您能解释一下非标准安装的情况吗?通常 Java 库只是放置在 CLASSPATH 中的 JAR 文件,但 JAI 也会安装本机 DLL。如果您部署到网络服务器,这将如何工作?
    • 您也可以获得纯 java JAI,但如果您的平台受本机代码支持,则没有理由这样做。如果您将应用部署到 Web 服务器,则服务器的 JRE 还必须安装 JAI 和 JAI/ImageIO 扩展。
    • @Jonathan Feinberg,您需要在类路径中包含 JAR,还是安装扩展使其成为 JRE 的一部分?
    • 安装程序会尽一切努力使其与您的 JRE“正常工作”。
    • 很抱歉打扰各位,JAI 和 JAI/ImageIO 的下载链接在哪里??
    【解决方案3】:

    使用imageMagicim4java之类的java库,它们的性能和质量比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>
    

    【讨论】:

    • 我同意 IM 的质量非常好,但我会很紧张在进程中使用它(因为在我看来,工程质量不好,可能会发生致命的崩溃) )。如果我打算使用 IM,我会改为使用 ProcessBuilder 向convert 支付费用。
    • @giladbu:ImageMagick 很棒,我按照乔纳森的建议做,但我只想评论“质量”部分:我非常怀疑 JAI 会产生质量比读取有损 TIFF 时的 ImageMagick(OP 的 TIFF 是否应该有损)。至于PNG,它是无损的,JAI 不会出错。所以在 TIFF 到 PNG 的情况下,我不同意 ImageMagick 的质量会比 JAI 更好。对于 TIFF-to-JPG,我们现在谈论的是完全不同的东西,我会毫不犹豫地使用 ImageMagick。
    • 嗯,我没有意识到 PNG 是无损的。
    • 那么 ImageMagic 方法需要什么?安装 ImageMagic 命令行工具,然后将 im4java jar 插入我的项目?
    • im4java 使用 ProcessBuilder 进行外壳转换。
    【解决方案4】:

    下载 JIMI Software Development Kit 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 是图形格式的 mimetypes

    【讨论】:

    • 它适用于 jpg、jpeg、png,但不适用于 tiff
    【解决方案5】:

    也许你可以使用这个代码,对我有用

    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;
            }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多