Ich mache einige Bildbearbeitung in Scala mit BufferedImages und Raster Objekte. Ich versuche, alle Pixel in dem gepufferten Bild mit dem folgenden Code zu erhalten.
val raster = f.getRaster()
// Preallocating the array causes ArrayIndexOutOfBoundsException .. http://forums.sun.com/thread.jspa?threadID=5297789
// RGB channels;
val pixelBuffer = new Array[Int](width*height*3)
val pixels = raster.getPixels(0,0,width,height,pixelBuffer)
Jetzt, wenn ich in relativ großen Dateien lese, funktioniert das gut. Wenn ich in 20x20 PNG-Dateien lesen, erhalte ich eine ArrayIndexOutOfBoundsException:
java.lang.ArrayIndexOutOfBoundsException: 1200
at sun.awt.image.ByteInterleavedRaster.getPixels(ByteInterleavedRaster.java:1050)
ich online gelesen habe, dass die Art und Weise, um dieses Problem die Pixelpuffer zu NICHT preallocate ist, sondern in einem Null-Wert zu übergeben und die man verwenden zurückgegeben von der Raster.getPixels-Methode.
Hier ist mein Problem. Als ich den naiven Ansatz tun und geben nur Nil als letztes Argument:
val pixels = raster.getPixels(0,0,width,height,Nil)
ich den Fehler
error: overloaded method value getPixels with alternatives (Int,Int,Int,Int,Array[Double])Array[Double] <and> (Int,Int,Int,Int,Array[Float])Array[Float] <and> (Int,Int,Int,Int,Array[Int])Array[Int] cannot be applied to (Int,Int,Int,Int,Nil.type)
val pixels = raster.getPixels(0,0,width,height,Nil)
So offensichtlich der Compiler nicht, welche der beiden Methoden bestimmen kann ich anrufen bin versucht, ; es ist mehrdeutig. Wenn ich Java verwenden würde, würde ich die Null setzen, um meine Absicht explizit zu machen. Ich kann mir nicht vorstellen, wie ich in Scala den gleichen Effekt erzielen kann. Dinge, die ich habe versucht:
val pixelBuffer:Array[Int] = Nil // Cannot instantiate an Array to Nil for some reason
Nil.asInstanceOf(Array[Int]) // asInstanceOf is not a member of Nil
Jede Idee, wie der Compiler explizit sagen, dass ich die Methode mit dem Int-Array als letzter Parameter anstelle einer Float-Array will?
EDIT: Wie eine Antwort darauf hinweist, bekam ich Nil mit Null vermischt. Nil ist eine leere Liste. Siehe die folgenden blog post
Auch sollte ich darauf hinweisen, dass die Array außerhalb der Grenzen Ausnahme war meine Schuld (wie diese Dinge oft sind). Das Problem war, ich nahm an, dass das Raster 3 Kanäle hatte, aber mein Bild hatte 4 Kanäle, da ich es so erstellt hatte. Ich preallocate stattdessen das Array wie folgt:
val numChannels = raster.getNumBands()
val pixelBuffer = new Array[Int](width*height*numChannels)
val pixels = raster.getPixels(minX,minY,width,height,pixelBuffer)
Danke für die Hilfe
Dies ist eine perfekte Erklärung. Thanks – I82Much
Ich würde eher Sie erklärt haben, dass das Zuschreiben bedeutet, welchen der möglichen Typen Sie einen Wert annehmen möchten, während Gießen einen Wert in einen anderen Typ erzwingt, den es möglicherweise nicht nehmen kann oder nicht. –