2011-07-26 16 views
6

Nếu tôi có hình ảnh PNG được mở dưới dạng BufferedImage, có thể giảm bảng màu trong hình ảnh PNG sao cho ít màu hơn (ít bit hơn cho mỗi pixel/độ sâu màu)?PNG - Có thể giảm bảng màu bằng cách sử dụng Java 2D không?

Ví dụ: nếu bạn xem Colour depth trên Wikipedia, tôi muốn sử dụng 16 màu trong hình ảnh PNG của tôi (hình thứ 3 ở phía bên tay phải).

Nếu không thể với Java 2D, có thư viện nào ở đó sẽ cho phép tôi thực hiện điều này một cách hiệu quả không?

+0

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

+0

Hãy xem các tùy chọn được cung cấp cho PNGImageWriter trong mã tại đây: http://forums.oracle.com/forums/thread.jspa?messageID=5386868 – Rekin

Trả lời

7

Tôi nghĩ Martijn Courteaux đã đúng:

comparison

Dưới đây là ví dụ thực hiện:

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

Hình ảnh giảm trông khủng khiếp. Tôi nghĩ 16 màu (phân bố đều) sẽ khá hơn 6 màu. (Nhưng vẫn +1.) –

+0

Cảm ơn, 16 màu sắc sẽ phá vỡ thụt đầu dòng và giới thiệu thanh cuộn. : D – Rekin

+0

Điều này làm việc một nét duyên dáng! Bạn có thể giải thích tại sao bạn có các chỉ mục có nhãn '// RED GREEN1 GREEN2 BLUE WHITE BLACK' Tại sao bạn có 'GREEN1' và 'GREEN2'? Cảm ơn – Joeblackdev

2

Tạo BufferedImage mới với bảng màu thấp hơn và sử dụng createGraphic() để có được đối tượng Graphics2D. Vẽ hình ảnh gốc trên đồ họa. dispose() đồ họa và bạn đang ở đây.

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

Cách xác định màu nhạt tte màu sắc? – Pindatjuh

+0

Điều này sẽ đạt được điều gì? – Joeblackdev

+0

Bạn chắc chắn không xứng đáng với sự giảm giá. Tôi đã cung cấp câu trả lời của mình để chứng minh điều đó. – Rekin