【问题标题】:How to achieve jpeg lossless?如何实现jpeg无损?
【发布时间】:2013-06-15 18:56:36
【问题描述】:

如何在Java中实现jpeg-lossess?

ImageWriter writer = (ImageWriter) ImageIO.getImageWritersByFormatName("JPEG-LS").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("JPEG-LS");
writer.setOutput(ImageIO.createImageOutputStream(new File("C:\\Users\\RileyRen\\Desktop\\123.jpg")));
writer.write(null, new IIOImage(subBufferedImage, null, null), param);

会抛出异常:

Exception in thread "main" 
    java.lang.IllegalArgumentException: Unknown compression type!
    at javax.imageio.ImageWriteParam.setCompressionType(ImageWriteParam.java:1041)
    at com.demandforce.ImageCrop.main(ImageCrop.java:59)

param.getCompressionTypes() 只打印[JPEG]

使用JAI(版本1.1.3):

    PlanarImage input = JAI.create("fileload", "C:\\Users\\RileyRen\\Desktop\\test.jpg");
    ParameterBlock pb = new ParameterBlock();
    pb.addSource(input);
    pb.add(x);
    pb.add(y);
    pb.add(width);
    pb.add(height);
    PlanarImage output = JAI.create("crop",pb,null);
    JAI.create("filestore",output,"C:\\Users\\RileyRen\\Desktop\\123.jpg","JPEG-LS");

同样抛出异常:

Exception in thread "main" 
    java.lang.IllegalArgumentException: FileStore The specified format has no associated registered ImageCodec.
    at javax.media.jai.JAI.createNS(JAI.java:1087)
    at javax.media.jai.JAI.create(JAI.java:973)
    at javax.media.jai.JAI.create(JAI.java:1621)
    at com.demandforce.ImageCrop.main(ImageCrop.java:103)

你能写一个示例吗?

【问题讨论】:

  • 试试System.out.println(Arrays.toString(param.getCompressionTypes()))
  • 奇怪。你能打印第一类的 ImageWriter 的类名吗?如果你真的有来自 JAI 的 CLibJPEGImageWriter(唯一能够支持 JPEG-LS AFAIK 的编写器),它应该同时支持 JPEG-LS 和 JPEG-LOSSLESS。注意:这些是不同的算法,不是同义词。

标签: java image jpeg jai


【解决方案1】:

标准 java 没有 JPEG-LS 的压缩类型。

您可以下载和使用 JAI(Java 高级成像)API,尽管我相信它包含这样的压缩类型。

可以从here下载

【讨论】:

  • 你能写个例子吗?谢谢!
  • 安装 JAI 后,您应该能够使用您的第一个实现,因为它安装了新的压缩类型。我认为这样做实际上是您要下载和安装的 Java Advanced Imaging Image I/O Tools。也可在此链接获得
  • 在我运行第一个示例之前,已经安装了 JAI。但我没有尝试 Java Advanced Imaging Image I/O Tools。希望它可以工作。
【解决方案2】:

第一个代码sn-p有错别字:

param.setCompressionType("JPEG-lS");

必须是

param.setCompressionType("JPEG-LS");

(全部大写)。 我认为这是正确的,应该可以工作。

要查询可能的类型,请使用param.getCompressionTypes()(如评论中所述)。

【讨论】:

  • 我认为这不是问题,我试过“JPEG-LS”、“JPEG-LOSSLESS”,也抛出了异常。无论如何,param.getCompressionTypes() 只打印[JPEG]
  • 好的。您可能应该编辑问题,以避免混淆。 :)
猜你喜欢
  • 1970-01-01
  • 2016-11-18
  • 2014-09-28
  • 2013-04-01
  • 2015-03-10
  • 1970-01-01
  • 2019-02-05
  • 2019-11-25
  • 2013-02-07
相关资源
最近更新 更多