2012-04-04 20 views
2

Ich habe ein planarimage, das ich über ein Beispielcode, den ich fand, zu Schwarz und Weiß umwandelte. Ich muss es dann in einen BufferedImage für den nächsten Codeabschnitt konvertieren. Aber ich bekomme die folgende Ausnahme:Java versuchen, Planarimage zu pufferedimage zu konvertieren, aber Colormodel ist inkompatibel

java.lang.IllegalArgumentException: Das angegebene ColorModel ist inkompatibel mit dem Bild SampleModel. bei javax.media.jai.PlanarImage.setImageLayout (PlanarImage.java:535) bei javax.media.jai.RenderedOp.createRendering (RenderedOp.java:867) bei javax.media.jai.RenderedOp.getRendering (RenderedOp. java: 888) bei javax.media.jai.RendedOp.createInstance (RenderedOp.java:799) bei javax.media.jai.RendedOp.createRendering (RenderedOp.java:867) bei javax.media.jai.RenderedOp. copydata (RenderedOp.java:2284)

Hier ist der Code I (Sun Beispiel, glaube ich) gefunden, die zu schwarz konvertiert und weiß:

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

Hier ist, was ich habe versucht, es zu einem BufferedImage zu konvertieren, in der Reihenfolge, ich habe versucht:

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

Kann mir jemand sagen, was ich falsch mache?

Ich habe festgestellt, dass selbst Aufruf dst.getNumBands() wird diesen Fehler werfen. Klar, ich weiß nicht, was ich hier mache. Genauer gesagt ruft der Aufruf dst.betNumbBands(); dies auf:

java.lang.IllegalArgumentException: Das angegebene ColorModel ist inkompatibel mit dem Image SampleModel. bei javax.media.jai.PlanarImage.setImageLayout (PlanarImage.java:535) bei javax.media.jai.RendedOp.createRendering (RenderedOp.java:867) bei javax.media.jai.RendedOp.getRendering (RenderedOp. java: 888) bei javax.media.jai.RendedOp.createInstance (RenderedOp.java:799) bei javax.media.jai.RendedOp.createRendering (RenderedOp.java:867) bei javax.media.jai.RenderedOp. getSampleModel (RenderedOp.java:2233) bei javax.media.jai.PlanarImage.getNumBands (PlanarImage.java:678)

Antwort

2

ich denke, ur Problem mit dem Farb Parameter sein könnte, die nicht mit der Farbparametern entspricht Dosis Quelle img . U kann diesen Code versuchen, der "bandCombine" opName implementiert.

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

} 

Hier ist, was passiert ist, v r nimmt nur die avg der drei Farbkomponenten (RGB) und in einer Matrix setzt sich dann auf einen parameterBlock Zugabe, die u die grayscaleImage gibt.

display() -Methode zeigt nur das Bild in einem JFrame.

Matrixerklärung: - Die Matrix hat folgende Form: - double [] [] matrix = new double [destBands] [sourceBands + 1]; sourceBands ist wichtig, wenn es RGB-Werte enthält, und das zusätzliche '+1' ist für die konstanten Werte, von denen jedes zum jeweiligen Band des Ziels hinzugefügt wird.

DIESES METHORD FUNKTIONIERT NUR FÜR .JPG-DATEIEN.

+0

Fehler: BandCombine: eine Zeile der Matrix hat nicht die richtige Anzahl von Einträgen. –