我有一个planetimage,可以通过一些示例代码将其转换为黑白图像。然后,我需要将其转换为下一个代码节的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)的平均值,并将其放入矩阵中,然后将其添加到parameterBlock中,这将为您提供grayscaleImage。
display()方法仅在JFrame中显示图像。
矩阵说明:-
矩阵的形式为:-
double [] []矩阵=新的double [destBands] [sourceBands +1];
sourceBands非常重要,因为它包含RGB值,并且额外的“ +1”用于表示常量值,每个常量值都添加到目标的相应频段。
此方法仅适用于.JPG文件。