2011-07-26 44 views
8

對於任何無知的道歉,但我從未在Java中使用過jpeg圖像(更不用說任何類型的圖像)。以編程方式減少JPEG文件大小

假設我想從Web服務向客戶端發送一個jpeg圖像。有什麼方法可以通過以某種方式操縱圖像的顏色配置文件來減少jpeg文件的大小?

我已經能夠通過使用稱爲imgscalr的BufferedImages的整潔工具來縮小圖像大小。見here

我還想要一個jpeg,它的顏色比高質量的jpeg圖像少。例如,我想能夠在我的jpeg中使用8位顏色,而不是16位顏色。

如果我從Java的2D包中獲得BufferedImage,我需要更改什麼?

回答

4

減少圖像大小的另一種方法是更改​​壓縮級別。你可以使用ImageWriter來做到這一點。

ImageWriter writer = null; 
    Iterator<ImageWriter> iwi = ImageIO.getImageWritersByFormatName("jpg"); 
    if (!iwi.hasNext()) 
     return; 
    writer = (ImageWriter) iwi.next(); 
    ImageWriteParam iwp = writer.getDefaultWriteParam(); 
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT) ; 
    iwp.setCompressionQuality(compressionQuality); 
    writer.setOutput(...); 
    writer.write(null, image, iwp); 
+0

嗨,什麼影響(視覺)會改變JPEG的壓縮?謝謝 – Joeblackdev

+1

看看這個帖子http://www.codinghorror。com/blog/2006/07/a-comparison-jpeg-compression-levels-and-recompression.html –

+0

我會仔細看看,謝謝你的鏈接。我想知道,如果有一種方法(使用該鏈接中的圖像)說在jpeg中使用較少的顏色?例如,要使用8位顏色而不是16位顏色?謝謝 – Joeblackdev

1

最簡單的方法是將字節流解壓縮爲Java圖像,可選擇調整其大小(使其更小),然後使用所需的質量設置重新生成JPEG圖像。

然後這個新圖像發送給客戶端。

+0

感謝您的支持,但這正是我目前爲止所做的。我使用名爲imgscalr的工具在發送給客戶端之前調整jpeg圖像的大小。但是,我還想更新jpeg的顏色配置文件以減少jpeg中的顏色。 「減少」我的意思是使用較少的顏色。我不確定這個術語... – Joeblackdev

1

看看ImageIO這個類。至於縮小文件大小:由於圖像已經是JPEG,所以你可以做的唯一事情就是降低質量或圖像大小。

要記住的另一件事是:如果圖像是CMYK jpeg,它可能會更大。不幸的是ImageIO無法處理這些,但您可以嘗試JAI ImageIO將CMYK轉換爲RGB(它應該小得多)。

1

可能的解決方案中的兩個縮減圖像,這裏是你會怎麼做:

BufferedImage original = //your image here 
scaled = original.getScaledInstance(finalWidth, finalHeight, Image.SCALE_SMOOTH); // scale the image to a smaller one 

BufferedImage result = new BufferedImage(finalWidth, finalHeight, original.getType()); 
Graphics2D g = result.createGraphics();  

g.drawImage(scaled, 0, 0, null); //draw the smaller image 
g.dispose(); 

顯然,你算算縮放寬度和高度,使圖像保持在相同長寬比。

一旦你畫它更小的,你現在可以把這個圖像轉換成JPEG文件:

BufferedImage image = // this is the final scaled down image 

JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(output); 
JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image); 

jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH); 
jpegEncodeParam.setXDensity(92); 
jpegEncodeParam.setYDensity(92); 

jpegEncodeParam.setQuality(0.8F , false); 
jpegEncoder.encode(image, jpegEncodeParam); 

這些類是從JAI包(更準確地說com.sun.image.codec。 jvg),JVM可能會抱怨說不應該直接使用它們,但是你可以忽略它。

您可以從here下載JAI,如果它不起作用我有github鏡像設置爲兩個庫,JAI coreJAI ImageIO