2012-04-04 74 views
2

我有一個planarimage,我通過我發現的一些示例代碼轉換爲黑色和白色。然後我需要將它轉換爲下一個代碼段的BufferedImage。但我得到以下例外:java嘗試將planarimage轉換爲bufferedimage,但colormodel不兼容

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) 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)

這裏是我發現轉換爲(太陽例如,我認爲)的代碼黑白:

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) 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)

回答

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); 

} 

這裏是什麼情況,V R只是把三個顏色分量(RGB)的平均,並把它在一個矩陣,然後將其添加到的ParameterBlock,這給U中的grayscaleImage。

display()方法只顯示JFrame中的圖像。矩陣說明: - 矩陣形式如下: - double [] [] [] [] matrix = new double [destBands] [sourceBands + 1]; [0124] sourceBands在包含RGB值時非常重要,額外的'+1'是用於將每個值添加到目標的相應波段的常量值。

此集合僅適用於.JPG文件。

+0

錯誤:BandCombine:矩陣的行沒有正確數量的條目.. – 2016-07-27 10:55:39

相關問題