如何使用ColorQuantizerDescriptor?

按照@ PhiLho回答如何将BufferedImage转换为8位的想法? ,我想使用ColorQuantizerDescriptor转换BufferedImage ,imageType TYPE_INT_RGB,但RenderedOp#getColorModel()抛出以下exception:

 java.lang.IllegalArgumentException:指定的ColorModel与图像SampleModel不兼容。
    在javax.media.jai.PlanarImage.setImageLayout(PlanarImage.java:541)
    在javax.media.jai.RenderedOp.createRendering(RenderedOp.java:878)
    在javax.media.jai.RenderedOp.getColorModel(RenderedOp.java:2253)

这是我试图使用的代码:

 final RenderedOp medianCutQuantizerOp = ColorQuantizerDescriptor.create(rgbImage, ColorQuantizerDescriptor.MEDIANCUT, 256, null, null, null, null, null); final BufferedImage bi = medianCutQuantizerOp.getAsBufferedImage(null, medianCutQuantizerOp.getColorModel()); 

我如何使用ColorQuantizerDescriptor

以下示例已在http://code.google.com/p/color-reduction-experiments/source/browse/trunk/it/geosolutions/mapproducers/MapProducersTest.java?r=2中进行了修改

 public class Main { public static void main(String[] args) throws Exception { BufferedImage original = ImageIO.read(new File("/Users/Nick/Desktop/with_flowers.jpg")); // 300 seems to be a good number final RenderedOp cqImage = ColorQuantizerDescriptor.create( original, ColorQuantizerDescriptor.OCTTREE, new Integer(255), new Integer(300), null, new Integer(2), new Integer(2), null); assert cqImage.getColorModel() instanceof IndexColorModel; final BufferedImage converted = cqImage.getAsBufferedImage(); SwingUtilities.invokeLater(new Runnable() { public void run() { final JFrame f = new JFrame(); f.setTitle("Test"); f.getContentPane().add((new ScrollingImagePanel(converted, 300, 300))); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.pack(); f.setVisible(true); } }); } } 

适合我: 使用八叉树

编辑:试过你的中位数削减,似乎也工作,虽然慢得多。

使用中值切割