clojure:使用变量args调用java类的静态方法

时间:2012-04-23 20:56:55

标签: java image clojure

我正在尝试使用clojure中的Scalr java图像大小调整库:

[org.imgscalr/imgscalr-lib "4.2"]

当我导入它并尝试使用它时失败,因为每个方法采用可变数量的args:

(import 'org.imgscalr.Scalr)
(def image (*acquire BufferedImage instance*))
(Scalr/resize image 200)

这给了我这个错误:

No matching method: resize

这是因为(正如我所知)resize将最后一个参数作为可变数量的BufferedImageOps。所以,我尝试传入一个java数组:

(import 'java.awt.image.BufferedImageOp)
(Scalr/resize image 200 (into-array BufferedImageOp []))

但是

失败了
No message.
[Thrown class java.lang.ClassCastException]

我在这里做错了什么?谢谢!

2 个答案:

答案 0 :(得分:1)

可能您没有按预期获取图像。 例如这对我有用....

*clojure-version*
{:major 1, :minor 3, :incremental 0, :qualifier nil}
user> (import 'java.awt.image.BufferedImageOp)
java.awt.image.BufferedImageOp
user> (import 'java.awt.image.BufferedImage)
java.awt.image.BufferedImage
user> (Scalr/resize (BufferedImage. 10 10 BufferedImage/TYPE_INT_ARGB) 200 (into-array BufferedImageOp []))
#<BufferedImage BufferedImage@ccfe446: type = 2 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000 IntegerInterleavedRaster: width = 200 height = 200 #Bands = 4 xOff = 0 yOff = 0 dataOffset[0] 0>
user> 

答案 1 :(得分:0)

into-array调用看起来没问题,但找到的方法签名here需要java.lang.Integer,而在Clojure中,200默认为java.lang.Long

如何转换为int:

(Scalr/resize image (int 200) (into-array BufferedImageOp []))