Java 如何使用ColorQuantizerDescriptor?

Java 如何使用ColorQuantizerDescriptor?,java,bmp,javax.imageio,jai,quantization,Java,Bmp,Javax.imageio,Jai,Quantization,按照的想法,我想使用ColorQuantizerDescriptor转换buffereImage、imageType\u INT\u RGB,但引发以下异常: java.lang.IllegalArgumentException: The specified ColorModel is incompatible with the image SampleModel. at javax.media.jai.PlanarImage.setImageLayout(PlanarImage.jav

按照的想法,我想使用
ColorQuantizerDescriptor
转换
buffereImage
、imageType\u INT\u RGB,但引发以下异常:

java.lang.IllegalArgumentException: The specified ColorModel is incompatible with the image SampleModel. at javax.media.jai.PlanarImage.setImageLayout(PlanarImage.java:541) at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:878) at javax.media.jai.RenderedOp.getColorModel(RenderedOp.java:2253)
如何使用
ColorQuantizerDescriptor

以下示例已从

为我工作:

编辑:尝试了你的中位切割,看起来也很有效,尽管速度慢得多


我很难相信getter会抛出异常。尝试在自己的行上中断对getColorModel的调用,然后将该变量传递到GetAsBuffereImage调用中。我想您会看到错误来自getAsBufferedImage调用。From,java.awt.image.ColorModel)-“调用方负责提供与图像的SampleModel兼容的ColorModel。”@I82Much getColorModel()可以引发异常(尽管没有文档!),因为它可以创建Op的呈现以获得模型。有趣的。运行此命令时,
original
的图像类型为5(类型为3BYTE\u BGR)。如果我修改代码以创建一个新的
buffereImage
,键入\u INT\u RGB,并将原始图像()绘制到类型\u INT\u RGB图像中,则
cqImage.getasbuffereImage()
抛出“IllegalArgumentException:指定的颜色模型与图像SampleModel不兼容”。显然,某些图像类型可以工作,但其他类型不行?如果你上传的图像无法工作,这可能会有所帮助。图像是生成的,我认为我无法发布它。不过没关系。我想这回答了我的问题,是的,这就是如何使用
ColorQuantizerDescriptor
,但是有一些限制。我在截图(可能是由AWT的机器人生成的)方面也遇到了类似的问题,在量化之前,我在类型为3BYTE的BGR buffereImage上绘制了图像,解决了这个问题。
final RenderedOp medianCutQuantizerOp = ColorQuantizerDescriptor.create(rgbImage, ColorQuantizerDescriptor.MEDIANCUT, 256, null, null, null, null, null);
final BufferedImage bi = medianCutQuantizerOp.getAsBufferedImage(null, medianCutQuantizerOp.getColorModel());
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);
            }
        });
    }
}