2011-07-26 23 views
6

BufferedImage olarak açılmış bir PNG resmim varsa, PNG görüntüsündeki paleti azaltmak için daha az renk (piksel/renk derinliği başına daha az bit) elde etmek mümkün müdür?PNG - Java 2D kullanarak paleti azaltmak mümkün mü?

Örneğin, Wikipedia'da Colour depth'a bakarsanız, PNG resmimdeki 16 rengi kullanmak isterim (3. resim sağ taraftadır).

Java 2D ile mümkün değilse, bunu etkin bir şekilde yapmamı sağlayacak bir kütüphane var mı?

+0

http://stackoverflow.com/questions/87062/color-reduction- in-java –

+0

Burada PNGImageWriter için sağlanan seçeneklere bir göz atın: http://forums.oracle.com/forums/thread.jspa?messageID=5386868 – Rekin

cevap

7

Ben Martijn Courteaux haklı olduğunu düşünüyorum: Burada

comparison

uygulanmasının örneği sunulmuştur:

import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.awt.image.IndexColorModel; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 

public class ImagingTest2 { 
    public static void main(String[] args) throws IOException { 
     BufferedImage src = ImageIO.read(new File("in.png")); // 71 kb 

     // here goes custom palette 
     IndexColorModel cm = new IndexColorModel(
       3, // 3 bits can store up to 8 colors 
       6, // here I use only 6 
       //   RED GREEN1 GREEN2 BLUE WHITE BLACK    
       new byte[]{-100,  0,  0, 0, -1,  0}, 
       new byte[]{ 0, -100, 60, 0, -1,  0}, 
       new byte[]{ 0,  0,  0, -100, -1,  0}); 

     // draw source image on new one, with custom palette 
     BufferedImage img = new BufferedImage(
       src.getWidth(), src.getHeight(), // match source 
       BufferedImage.TYPE_BYTE_INDEXED, // required to work 
       cm); // custom color model (i.e. palette) 
     Graphics2D g2 = img.createGraphics(); 
     g2.drawImage(src, 0, 0, null); 
     g2.dispose(); 

     // output 
     ImageIO.write(img, "png", new File("out.png")); // 2,5 kb 
    } 
} 
+1

İndirgenmiş görüntü korkunç görünüyor. Sanırım 16 renk (eşit olarak dağıtılmış) 6'larınızdan daha iyi olurdu. (Ama yine de +1.) –

+0

Teşekkürler, 16 renk girintiyi kırar ve kaydırma çubukları getirir. : D – Rekin

+0

Bu bir çekicilik çalışıyor! Niçin "// RED GREEN1 GREEN2 BLUE WHITE BLACK" etiketli indekslere sahip olduğunuzu açıklayabilir misiniz? Neden 'GREEN1' ve 'GREEN2' var? Teşekkürler – Joeblackdev

2

Alt paletle yeni bir BufferedImage oluşturun ve Graphics2D nesnesini edinmek için createGraphic() kullanın. Orijinal görüntüyü grafiklere çizin. dispose() grafikler ve işte buradasınız.

BufferedImage img = new BufferedImage(orig.getWidth(), orig.getHeight(), 
             BufferedImage.TYPE_USHORT_555_RGB); 
+1

Soluk nasıl tanımlanır tte renkler? – Pindatjuh

+0

Bu ne elde edecek? – Joeblackdev

+0

Kesinlikle reddetmeyi hak etmediniz. Bunu kanıtlamak için cevabımı verdim. – Rekin