- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个平面图像,我通过找到的一些示例代码将其转换为黑白图像。然后我需要将它转换为下一个代码部分的 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 中显示图像。
矩阵解释:-矩阵的形式为:-双 [][] 矩阵 = 新的双 [destBands][sourceBands + 1];sourceBands 很重要,因为它包含 RGB 值,额外的“+1”是常量值,每个常量值都添加到目标的相应波段。
此方法仅适用于 .JPG 文件。
关于java 尝试将 planarimage 转换为 bufferedimage 但 colormodel 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10004142/
我试图确定图像是否采用特定格式,以确定对图像执行哪种处理。 我在 println 语句中完成了 BufferedImageObject.getColorModel() 来查看它返回的内容以及它的太多信
请不要讨厌这个“一般性问题”,因为它确实是一个问题。我还搜索了其他问题,问题总是人们想要实例化接口(interface)。那不是我的情况。 类 ColorModel 不是接口(interface),它
我需要在图像上用白色替换一种颜色。我读过有关 ColorModel 和 RGBImageFilter.substituteColorModel 的内容,但我不太了解。 我要替换的颜色是:回复:113重
我正在自学围棋。我决定尝试一些计算机视觉的东西。首先我要做一个图像直方图。我正在尝试获取颜色模型,以便知道像素的强度范围。当我打印 image.ColorModel() 时,它会给我一个神秘的十六进制
我正在使用自定义调色板(即自定义颜色模型)创建图像: BufferedImage img = new BufferedImage(orgImg.getWidth(), orgImg.getHeigh
我想提取图像像素的R、G和B值。我通过两种方式做到这一点。 File img_file = new File("../foo.png"); BufferedImage img = ImageIO.re
我在 java 中使用图像处理库来处理图像。我做的第一步是读取图像并创建一个 java.awt.Image.BufferedImage 对象。我是这样做的, BufferedImage sourceI
我需要将客户提供的 JPG 图像转换为 sRGB 格式 (sRGB IEC61966-2.1),以便它们可以用于网络。 我可以使用 ImageIO 和 BufferedImage 成功完成此操作,但此
在 Java 中使用 BufferedImage 类时,我通常使用带有参数 int width、int height、int type 的构造函数。不过,对于某个应用程序,我想要一个图像,该图像将使用
我有一个平面图像,我通过找到的一些示例代码将其转换为黑白图像。然后我需要将它转换为下一个代码部分的 BufferedImage。但是我得到以下异常: java.lang.IllegalArgument
Go 的 image.Image 接口(interface)有三个方法:Bounds(对于确定图像的大小显然是必需的),At(返回每个像素的实际颜色)和 ColorModel。最后一个方法返回一个 c
我是一名优秀的程序员,十分优秀!