2012-04-04 14 views
2

私が見つけたサンプルコードで白黒に変換する平面画像があります。次に、次のコードセクションのためにBufferedImageに変換する必要があります。しかし、次の例外が発生します。java planarimageをbufferedimageに変換しようとしましたが、colormodelは互換性がありません

java.lang.IllegalArgumentException:指定されたColorModelがイメージSampleModelと互換性がありません。 javax.media.jai.RenderedOp.getRenderingでjavax.media.jai.RenderedOp.createRendering(RenderedOp.java:867) でjavax.media.jai.PlanarImage.setImageLayout(PlanarImage.java:535) (RenderedOpで 。 java:888) at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:799) (javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867) 、javax.media.jai.RenderedOp) CopyData(RenderedOp.java:2284)

ここでは黒と白に変換するIが見出さコード(サンの例では、私が考える)である:

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.RenderedOp.getRenderingでjavax.media.jai.RenderedOp.createRendering(RenderedOp.java:867) でjavax.media.jai.PlanarImage.setImageLayout(PlanarImage.java:535) (RenderedOpで 。 java:888) at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:799) (javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867) 、javax.media.jai.RenderedOp) javax.media.jai.PlanarImage.getNumBandsでgetSampleModel(RenderedOp.java:2233) (PlanarImage.java:678)

答えて

2

私はウルの問題は、元IMGの色空間パラメータと一致しませ線量色空間パラメータであるかもしれないと思います。 "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); 

} 

、ちょうど3つの色成分(RGB)の平均を取り、UをgrayscaleImageを与えるのParameterBlock、それを付加し、マトリックスに入れるのV R。

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

マトリックスの説明: - マトリックスは次の形式です。 - double [] [] matrix = new double [destBands] [sourceBands + 1]; sourceBandsは、RGB値を含む場合は重要で、余分な '+1'は、それぞれが宛先のそれぞれの帯域に追加される定数値です。

このメソッドは、.JPGファイルのみを対象としています。

+0

エラー:BandCombine:行列の行に正しい数のエントリがありません。 –

関連する問題