如何使用颜色量化器描述符?

Posted

技术标签:

【中文标题】如何使用颜色量化器描述符?【英文标题】:How to use ColorQuantizerDescriptor? 【发布时间】:2013-03-09 16:16:51 【问题描述】:

按照@PhiLho's answer to How to convert a BufferedImage to 8 bit?的思路,我想用ColorQuantizerDescriptor来转换一个BufferedImage,imageType TYPE_INT_RGB,但是RenderedOp#getColorModel()抛出如下异常:

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

【问题讨论】:

我很难相信 getter 会抛出异常。尝试在自己的行上中断对 getColorModel 的调用,然后将该 var 传递给 getAsBufferedImage 调用。我想你会看到错误来自 getAsBufferedImage 调用。 From download.java.net/media/jai/javadoc/1.1.3/jai-apidocs/javax/…, java.awt.image.ColorModel) - “调用者负责提供与图像的 SampleModel 兼容的 ColorModel。” @I82Much getColorModel() 可以抛出异常(尽管没有记录!),因为它可以创建 Op 的渲染以获取模型。 【参考方案1】:

以下示例已从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);
            
        );
    

为我工作:

编辑:尝试使用您的中位数切割,似乎也可以,但速度要慢得多。

【讨论】:

有趣。 original 运行时的图像类型为 5 (TYPE_3BYTE_BGR)。如果我修改代码以创建新的BufferedImage、TYPE_INT_RGB 和 drawImage() 将原始图像放入 TYPE_INT_RGB 图像中,则cqImage.getAsBufferedImage() 会抛出“IllegalArgumentException:指定的 ColorModel 与图像 SampleModel 不兼容”。显然某些图像类型有效,而其他图像类型无效? 上传无法上班的图片可能会有所帮助。 图像生成了,我认为我不能发布它。不过没关系。我认为这回答了我的问题,是的,这就是 ColorQuantizerDescriptor 的使用方式,但有一些限制。 我在截图时遇到了类似的问题(可能是用 AWT 的机器人生成的),并通过在量化之前在 TYPE_3BYTE_BGR BufferedImage 上绘制图像来解决它。

以上是关于如何使用颜色量化器描述符?的主要内容,如果未能解决你的问题,请参考以下文章

计算机视觉-图像描述符(图片分类)

如何在资源管理器的文本区域中设置占位符的样式?

如何转换自定义矢量化器以预测分类?

在 Edge 浏览器上,如何使用 CSS 更改输入占位符文本颜色?

如何更改焦点上的占位符颜色?

如何在角材料中使用 css 更改 md-input-container 占位符颜色?