2

見つけたサンプルコードを使用して白黒に変換するplanarimageがあります。次に、次のコードセクションのためにそれをBufferedImageに変換する必要があります。しかし、次の例外が発生します。

java.lang.IllegalArgumentException:指定されたColorModelは画像SampleModelと互換性がありません。javax.media.jai.PlanarImage.setImageLayout(PlanarImage.java:535)at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)at javax.media.jai.RenderedOp.getRendering(RenderedOp.java:888) )at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:799)at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)at 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)at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)at javax.media.jai.RenderedOp.getRendering(RenderedOp.java:888) )at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:799)at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)at javax.media.jai.RenderedOp.getSampleModel(RenderedOp.java: 2233)javax.media.jai.PlanarImage.getNumBands(PlanarImage.java:678)で

4

1 に答える 1

2

問題は、ソースimgのcolorSpaceパラメーターと一致しないcolorSpaceパラメーターにあると思います。Uは、「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);

 }

ここで何が起こるかというと、vrは3つの色成分(RGB)の平均を取り、それをマトリックスに入れてから、それをparameterBlockに追加します。これにより、uはgrayscaleImageになります。

display()メソッドは、JFrame内に画像を表示するだけです。

マトリックスの説明:-マトリックスは次の形式です:-double [] [] matrix = new double [destBands] [sourceBands + 1]; sourceBandsは、RGB値が含まれている場合に重要であり、追加の「+1」は、それぞれが宛先のそれぞれの帯域に追加される定数値用です。

この方法は、.JPGファイルに対してのみ機能します。

于 2014-06-10T18:19:16.233 に答える