如何使用颜色量化器描述符?
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()抛出如下异常:
这是我尝试使用的代码:
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 上绘制图像来解决它。以上是关于如何使用颜色量化器描述符?的主要内容,如果未能解决你的问题,请参考以下文章