2012-04-04 1 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) в 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)

ответ

2

Я думаю, ур проблема может быть с параметром COLORSPACE который доза не совпадает с параметром COLORSPACE исходного IMG в , 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); 

} 

Вот что случается, v г просто принимая СРЕДНЕМ из трех цветовых компонентов (RGB) и положить его в матрицу затем добавить его в parameterBlock, что дает ЕВ grayscaleImage.

display() метод просто отображает изображение внутри JFrame.

описание матрицы: - Матрица представлена ​​в виде: - double [] [] matrix = new double [destBands] [sourceBands + 1]; sourceBands важно там, где оно содержит значения RGB, а дополнительный «+1» - для постоянных значений, каждый из которых добавляется в соответствующий диапазон адресата.

ЭТОТ МЕТОРД РАБОТАЕТ ТОЛЬКО ДЛЯ ФАЙЛОВ .JPG.

+0

Ошибка: BandCombine: строка матрицы не имеет правильного количества записей. –

Смежные вопросы