Hi Phil, Part of me hopes there's a nicer way of doing this, but I was able to get it working using:
(defn bi-get-pixels [#^BufferedImage bi] (let [raster (.getData bi) pixels (.getPixels raster 0 0 (.getWidth bi) (.getHeight bi) (cast (Class/forName "[I") nil))] (vec pixels))) Cheers, Mark On Jul 5, 10:18 pm, "philip.hazel...@gmail.com" <philip.hazel...@gmail.com> wrote: > Hi, > > The following code works as expected: > > (import 'javax.imageio.ImageIO 'java.io.File > 'java.awt.image.BufferedImage) > (defn bi-get-pixels > [bi] > (vec (.. bi (getData) (getPixels 0 0 (.getWidth bi) (.getHeight bi) > nil)))) > (bi-get-pixels (. ImageIO read (File. "/home/phil/prog/small- > test.png"))) > > But if *warn-on-reflection* is true, it generates four warnings. If we > try to shut it up with a type hint: > > (defn bi-get-pixels > [#^BufferedImage bi] > (vec (.. bi (getData) (getPixels 0 0 (.getWidth bi) (.getHeight bi) > nil)))) > > Exception in thread "main" java.lang.IllegalArgumentException: More > than one matching method found: getPixels (imagio-test.clj:7) > at clojure.lang.Compiler.analyzeSeq(Compiler.java:4558) > ... > Caused by: java.lang.IllegalArgumentException: More than one matching > method found: getPixels > at clojure.lang.Compiler.getMatchingParams(Compiler.java:2122) > at clojure.lang.Compiler$InstanceMethodExpr.<init> > (Compiler.java:1159) > at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java: > 810) > at clojure.lang.Compiler.analyzeSeq(Compiler.java:4551) > ... 34 more > > The problem here is that getPixels has three forms: > (http://java.sun.com/j2se/1.4.2/docs/api/java/awt/image/Raster.html) > double[] getPixels(int x, int y, int w, int h, double[] dArray) > Returns a double array containing all samples for a > rectangle of pixels, one sample per array element. > float[] getPixels(int x, int y, int w, int h, float[] fArray) > Returns a float array containing all samples for a rectangle > of pixels, one sample per array element. > int[] getPixels(int x, int y, int w, int h, int[] iArray) > Returns an int array containing all samples for a rectangle > of pixels, one sample per array element. > > In each case, if the final argument is NULL it is ignored, and if not > the array is populated with the return data from the call (generating > an error if it's not large enough). > > Is it possible to specify which invocation of getPixels I intend > without passing an array? I've tried putting #^ints in some likely- > looking places, but nil can't be type-hinted and the others seem to > have no effect. I've also tried splitting the .. up: > > (defn bi-get-pixels > [#^BufferedImage bi] > (let [rast (.getData bi) > #^ints pi (.getPixels rast 0 0 (.getWidth bi) (.getHeight bi) nil)] > pi)) > > But this doesn't work either. I could do manual reflection on Raster > to get the correct method and .invoke it, but that seems far more > complicated than necessary. Any other ideas? > > -Phil --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---