2011-07-26 11 views
8

Herhangi bir cehalet için özür dilerim, ancak daha önce Java'da jpeg görüntüleri (her türlü görüntü türünü) kullanmamıştım.Programatik Olarak Azaltılması JPEG dosya boyutu küçültme

Varsayalım Bir web servisinden istemciye bir jpeg görüntüsü göndermek istiyorum. Görüntünün renk profilini bir şekilde işleyerek jpeg dosya boyutunu küçültebilmemin bir yolu var mı?

Resim boyutu, imgscalr adı verilen BufferedImages için düzgün bir araç kullanarak ölçeklendirerek zaten çoktan küçültebiliyorum. Bakınız here.

Yüksek kaliteli bir jpeg görüntüsünden daha az rengi olan bir jpeg de isterim. Örneğin, 16bit renk yerine jpegimde 8bit renk kullanabilmek istiyorum.

Java'nın 2D paketinden BufferedImage'ım varsa tam olarak neye ihtiyacım var?

cevap

4

Görüntü boyutunu küçültmenin başka bir yolu da sıkıştırma düzeyini değiştirmek. Bunu ImageWriter kullanarak yapabilirsiniz. olası çözümler

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

Merhaba, jpeg'in sıkıştırmasını değiştirecek olan (görsel olarak) ne etkisi var? Teşekkürler – Joeblackdev

+1

Bu yazıya bir bakın http: //www.codinghorror.com/blog/2006/07/a-jpeg-sıkıştırma-seviyeleri-ve-recompression.html karşılaştırması –

+0

Daha yakından bakacağım, bağlantı için teşekkürler. Eğer jpeg daha az renk kullanmak demek için bir yol varsa (bu bağlantıda görüntüleri kullanarak) merak ediyordum? Örneğin, 16bit renk yerine 8 bit renk kullanmak için? Teşekkürler – Joeblackdev

1

Bunu yapmanın en kolay yolu, bayt akışını bir Java Resminin içine sıkıştırmak, isteğe bağlı olarak yeniden boyutlandırmak (küçültmek) ve ardından JPEG görüntüsünü istenen kalite ayarıyla yeniden oluşturmaktır.

Bu yeni görüntü sonra istemciye gönderilir.

+0

Bunun için teşekkürler, ama bu şimdiye kadar sahip olduğum şey. İstemciye gönderilmeden önce jpeg resmini yeniden boyutlandırmak için imgscalr adlı bir araç kullanıyorum. Bununla birlikte, jpeg'deki renkleri azaltmak için jpeg'in renk profilini de güncellemek istiyorum. "Azalt" ile daha az renk kullanıyorum. Bu terminolojiden emin değilim ... – Joeblackdev

1

ImageIO sınıfına bir göz atın. Dosya boyutunu küçültmek için: görüntü bir JPEG zaten olacağından, yapabileceğiniz tek şey kaliteyi veya görüntü boyutunu azaltmaktır.

Akılda tutulması gereken bir başka nokta: eğer görüntü bir CMYK jpeg ise daha büyük olabilir. Ne yazık ki, ImageIO bunlarla başa çıkamaz, ancak CMYK'dan RGB'ye (daha küçük olması gerekir) dönüştürmek için JAI ImageIO'u deneyebilirsiniz.

1

İki görüntüyü ölçek küçültme ediyorsa, aşağıda bu yapardım nasıl:

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(); 

Açıkçası görüntü aynı tarafından kalır öyleyse, ölçekli genişliğini ve yüksekliğini hesaplamak zorunda en boy oranı.

bunu daha küçük çizilmiş sonra, şimdi JPEG dosyası içine bu resim açabilirsiniz:

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

Bu sınıflar JAI paketi (daha tam olarak com.sun.image.codec gelmektedir. jpeg) ve JVM doğrudan kullanılmaması gerektiğinden şikayet edebilir, ancak bunu göz ardı edebilirsiniz.

Muhtemelen ben github iki kütüphaneler, JAI core ve JAI ImageIO için kurulum aynalar var çalışmıyorsa, here den Jai indirebilirsiniz.