【问题标题】:Graphics2D.drawString with float arguments from Clojure带有来自 Clojure 的浮点参数的 Graphics2D.drawString
【发布时间】:2023-03-11 21:07:01
【问题描述】:

我创建了一个绘制 PNG 图像的 Java sample code 的 Clojure 实现。我的 Clojure 版本如下。它可以工作,但如果我drawString() 的参数强制转换为整数,Clojure 编译器会抛出错误。 API 文档显示 Graphics2D.drawString() 接受浮点参数,但其超类 Graphics.drawString() 不接受。如何说服/欺骗/提示 Clojure 使用 drawString() 的浮动版本?

(defn render-image [message]
  (let [width 200 height 200
        bi (java.awt.image.BufferedImage. width height java.awt.image.BufferedImage/TYPE_INT_ARGB)
        font (java.awt.Font. "TimesRoman" java.awt.Font/BOLD 20)
        ig (doto ^java.awt.Graphics2D (.createGraphics bi) (.setFont font))
        metrics (.getFontMetrics ig)
        str-width (.stringWidth metrics message)
        str-height (.getAscent metrics)]
    (doto ig
      (.setPaint java.awt.Color/BLACK)

      ;; Compiler complains if x- and y-arguments to .drawString
      ;; are not integers. Why?
      (.drawString message
                   (int (/ (- width str-width) 2))
                   (int (+ (/ height 2) (/ str-height 4)))))
    
    bi))

(defn -main [filename]
  (-> (render-image "Hello world")
      (javax.imageio.ImageIO/write "PNG" (java.io.File. filename))))

【问题讨论】:

    标签: java clojure graphics2d


    【解决方案1】:

    运行时(而不是编译器)必须决定使用.drawString 的哪个重载。它愿意自动执行的转换集可以在Reflector.java 中找到。请注意,对于声明为float(如您所愿)的方法参数,它只接受floatFloatdouble。但是两个整数相除的结果是一个有理数。因此,float 方法不适用。 int 方法也没有,因为同样没有从理性到int 的自动转换。

    您可以在一个更简单的案例中看到同样的事情发生:(Float/valueOf (/ 1 2))

    由于没有自动转换,您必须显式转换。您使用int 成功地做到了这一点,但显然您不想调用int 方法。解决方案很简单:改为使用float 进行转换。

    【讨论】:

    • 感谢您的回答。我忘了 'ratio' 是 Clojure 中的一种类型。
    【解决方案2】:

    将您的 drawstring 调用更改为

      (.drawString message
                   (float (/ (- width str-width) 2))
                   (float (+ (/ height 2) (/ str-height 4)))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多