java尝试将平面图像转换为缓冲图像,但颜色模型不兼容

标签 java image colors jai

我有一个平面图像,通过我找到的一些示例代码将其转换为黑白图像。然后我需要将其转换为下一个代码部分的 BufferedImage。但我得到以下异常:

java.lang.IllegalArgumentException:指定的 ColorModel 与图像 SampleModel 不兼容。 在 javax.media.jai.PlanarImage.setImageLayout(PlanarImage.java:535) 在 javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867) 在 javax.media.jai.RenderedOp.getRendering(RenderedOp.java:888) 在 javax.media.jai.RenderedOp.createInstance(RenderedOp.java:799) 在 javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867) 在 javax.media.jai.RenderedOp.copyData(RenderedOp.java:2284)

这是我找到的转换为黑白的代码(我认为是 Sun 的例子):

ParameterBlock pb = new ParameterBlock();
pb.addSource(input);
ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[] {8}, 
    false, 
    false, 
    Transparency.OPAQUE, 
    DataBuffer.TYPE_BYTE);
pb.add(cm);
PlanarImage src = JAI.create("ColorConvert", pb);

pb = new ParameterBlock();
pb.addSource(src);
String opName = null;
opName = "errordiffusion";
LookupTableJAI lut =  new LookupTableJAI(new byte[] {(byte)0x00, (byte)0xff});
pb.add(lut);
pb.add(KernelJAI.ERROR_FILTER_FLOYD_STEINBERG);


// Create a layout containing an IndexColorModel which maps
// zero to zero and unity to 255.
ImageLayout layout = new ImageLayout();
byte[] map = new byte[] {(byte)0x00, (byte)0xff};
cm = new IndexColorModel(1, 2, map, map, map);
layout.setColorModel(cm);

// Create a hint containing the layout.
RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT,layout);

// Dither the image.
PlanarImage dst = JAI.create(opName, pb, hints);

这是我尝试将其转换为 BufferedImage 的方法,按照我尝试的顺序:

//doesn't work
BufferedImage image = dst.getAsBufferedImage();

//thought of using the color model the b&w process did,also doesn't work
byte[] map = new byte[] {(byte)0x00, (byte)0xff};
ColorModel cm = new IndexColorModel(1, 2, map, map, map);
BufferedImage image = new BufferedImage(cm, dst.copyData(), false, null);

//I had the most hope for this one,but same error again
WritableRaster wr = dst.copyData();
ColorModel cm = PlanarImage.createColorModel(wr.getSampleModel());
BufferedImage image = new BufferedImage(cm, wr, false, null);

谁能告诉我我做错了什么?

我发现即使打电话dst.getNumBands()会抛出这个错误。显然我不知道我在这里做什么。更准确地说,调用 dst.betNumbBands();会导致这样的情况:

java.lang.IllegalArgumentException:指定的 ColorModel 与图像 SampleModel 不兼容。 在 javax.media.jai.PlanarImage.setImageLayout(PlanarImage.java:535) 在 javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867) 在 javax.media.jai.RenderedOp.getRendering(RenderedOp.java:888) 在 javax.media.jai.RenderedOp.createInstance(RenderedOp.java:799) 在 javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867) 在 javax.media.jai.RenderedOp.getSampleModel(RenderedOp.java:2233) 在 javax.media.jai.PlanarImage.getNumBands(PlanarImage.java:678)

最佳答案

我认为您的问题可能是 colorSpace 参数与源 img 的 colorSpace 参数不匹配。 你可以尝试这个实现“bandCombine”opName的代码。

 public void imageToGrayScale()
 {
  double[][] matrix1 = {{ 1./3, 1./3, 1./3, 0 }};

  ParameterBlock pb = new ParameterBlock();
  pb.addSource(image);
  pb.add(matrix1);

  PlanarImage dst = (PlanarImage) JAI.create("bandCombine",pb,null);



  BufferedImage img = dst.getAsBufferedImage();
  display(img);

 }

这里发生的是,v r 只需取三个颜色分量 (RGB) 的平均值并将其放入矩阵中,然后将其添加到参数 block 中,这将为您提供灰度图像。

display() 方法仅显示 JFrame 内的图像。

矩阵解释:- 矩阵的形式为:- double[][] 矩阵 = new double[destBands][sourceBands + 1]; sourceBands 非常重要,因为它包含 RGB 值,而额外的“+1”用于常量值,每个常量值都会添加到目标的相应频段。

此方法仅适用于 .JPG 文件。

关于java尝试将平面图像转换为缓冲图像,但颜色模型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004142/

相关文章:

Java无限递归自引用类型

java - 基于原始数据创建实例

image - canvas draw图像质量

html - CSS/HTML 使用计数器设置颜色

javascript - 输入文本需要改变颜色

php - 基于数字的颜色编码

java - 从任何地方访问组合框值

java - 如何在 JavaFX 选项卡中显示 JFreeChart?

html - 浏览器比例不同时出现额外框

android - 如何将图像导入或复制到 Android Studio 中的 "res"文件夹?