2013-06-19 40 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 –