2011-07-26 15 views
6

PNG画像をBufferedImageとして開いた場合、PNG画像内のパレットを減らして、色が少なくなるようにすることができますか?PNG - Java 2Dを使用してパレットを縮小することはできますか?

たとえば、WikipediaでColour depthを見ると、私のPNGイメージ(右から3番目のイメージ)に16色を使用したいと思います。

Java 2Dでは不可能な場合は、これを効果的に実行できるライブラリがありますか?

+0

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

+0

ここでコードでPNGImageWriterに提供されるオプションを見てください:http://forums.oracle.com/forums/thread.jspa?messageID=5386868 – Rekin

答えて

7

私はマルタインCourteauxは正しかったと思う:ここ

comparison

は実装例です:

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

縮小画像はひどいです。私は16色(均等に配分された)があなたの6色よりもかなり良いと思います。 (しかしまだ+1です。) –

+0

ありがとうございました、16色はインデントを破り、スクロールバーを導入します。 :D – Rekin

+0

これは魅力的です!なぜあなたはインデックスに '/ /赤緑1緑2青白黒 'というラベルが付いているのか説明できますか?なぜあなたは'緑1 'と'緑2 'を持っていますか?ありがとう – Joeblackdev

2

下部のパレットで新しいBufferedImageを作成し、createGraphic()を使用してGraphics2Dオブジェクトを取得します。グラフィックス上に元の画像を描画します。 dispose()グラフィックスはこちらです。

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

淡色を定義する方法色は? – Pindatjuh

+0

これは何を達成するでしょうか? – Joeblackdev

+0

あなたは確かにdownvoteに値しませんでした。私はそれを証明するために私の答えを提供しました。 – Rekin

関連する問題