【问题标题】:Quil loading an image to an already created appletQuil 将图像加载到已创建的小程序中
【发布时间】:2020-07-05 00:33:51
【问题描述】:

我正在尝试使用 Clojure Quil 库创建加载图像到小程序。当我存储 load-image 引用并将其与image 调用一起使用时,在加载期间它可以工作。但是当我加载并在draw中显示时它不起作用。

这行得通:

(ns img-demo.core
  (:require [quil.core :as q]))

(def img (ref nil))

(def img-url "https://dummyimage.com/100x100/2c3e50/ffffff.png")

(defn setup []
  (q/background 0)
  (dosync (ref-set img (q/load-image img-url))))

(q/defsketch example
  :title "image demo"
  :setup setup
  :draw #(q/image @img 0 0)
  :size [600 600])

这不起作用,

(ns img-demo.core
  (:require [quil.core :as q]))

(def img-url "https://dummyimage.com/100x100/2c3e50/ffffff.png")


(q/defsketch example
  :title "image demo"
  :draw #(q/image (q/load-image img-url) 0 0)
  :size [600 600])

在后一种情况下,我知道应该在quil.applet/with-applet 内部调用load-image。由于它发生在defsketch 内部,我希望它会自动得到处理或至少抛出一个 NPE。为什么它不起作用?

【问题讨论】:

    标签: clojure quil


    【解决方案1】:

    load-image 异步加载图像,因此它在第二个示例中不起作用的原因是因为在调用 draw 时图像尚未加载。您可以在调用image 之前使用loaded? 函数进行分支检查:

    (q/defsketch example
                 :title "image demo"
                 :draw #(let [img (q/load-image img-url)]
                          (if (q/loaded? img)
                            (q/image img 0 0)
                            (q/ellipse 100 100 100 100)))
                 :size [600 600])
    

    运行上面的代码,你会看到画了一个圆圈,因为img 还没有加载。你也不会得到空指针异常,因为load-image 没有返回nil - 它只是在调用draw 之前没有完成加载图像。因此,所发生的只是空白画布上没有绘制任何内容。

    这就是为什么通常建议在 setup 中加载图像的原因(以及您的第一个示例有效的原因)。 setup 被执行之前 draw,这保证了当draw 被调用时图像已经被加载。

    【讨论】:

      猜你喜欢
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 2014-02-09
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多