2013-06-19 41 views
2

如何在Java中实现jpeg-lossess?如何实现jpeg无损?

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) 

你可以写一个样吗?

+0

尝试'System.out.println(Arrays.toString(param.getCompressionTypes()))'。 –

+0

只有[JPEG] ... –

+0

奇怪。你能打印第一类ImageWriter的类名吗?如果您真的拥有来自JAI的CLibJPEGImageWriter(唯一能够支持JPEG-LS AFAIK的作家),它应该支持JPEG-LS和JPEG-LOSSLESS。注意:这些是不同的算法,而不是同义词。 – haraldK

回答

3

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

您可以下载并使用JAI(Java高级成像)API,但我相信这种API包含这种压缩类型。

可以从here

+0

你能写一个样本吗? –

+0

安装JAI之后,您应该可以在安装新的压缩类型时使用第一个实现。我认为要做到这一点,它实际上是您要下载和安装的Java高级图像映像I/O工具。也可在此链接 –

+0

在我运行第一个示例之前,JAI已经安装。但我没有尝试Java高级图像I/O Tools.Hopes它将工作。 –

1

下载第一代码片段有一个错字:

param.setCompressionType("JPEG-lS"); 

它必须是

param.setCompressionType("JPEG-LS"); 

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

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

+0

我认为这不是问题,我试过“JPEG-LS”,“JPEG-LOSSLESS”,也抛出了exceptions.thk u,无论如何,''param.getCompressionTypes()'只打印'[JPEG]'。 –

+0

好的。你应该编辑这个问题,以避免混淆。 :) – haraldK

+0

感谢您提醒@haraldK –