2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面了解如何使用本站的一些更多信息。

0
编译器
编辑

我们在使用org.apache.batik将svg字符串渲染为图像。为了设置我们获得的图像质量,我们代理org.apache.batik.transcoder.image.PNGTranscoder,以便在调用createRenderer时可以为返回的渲染应用一些图像渲染设置。方法createRenderer是抽象类org.apache.batik.transcoder.image.ImageTranscoder中的一个受保护的方法,PNGTranscoder是扩展该类的。

完整的代码如下

(set! *warn-on-reflection* true)
(defn- high-quality-png-transcoder ^PNGTranscoder []
  (proxy [PNGTranscoder] []
    (createRenderer []
      (let [add-hint                (fn [^RenderingHints hints k v] (.add hints (RenderingHints. k v)))
            ^ImageRenderer renderer (proxy-super createRenderer) ;; line 104
            hints                   (RenderingHints.
                                     RenderingHints/KEY_ALPHA_INTERPOLATION
                                     RenderingHints/VALUE_ALPHA_INTERPOLATION_QUALITY)]
        (doto hints
          (add-hint RenderingHints/KEY_ALPHA_INTERPOLATION RenderingHints/VALUE_ALPHA_INTERPOLATION_QUALITY)
          (add-hint RenderingHints/KEY_INTERPOLATION       RenderingHints/VALUE_INTERPOLATION_BICUBIC)
          (add-hint RenderingHints/KEY_ANTIALIASING        RenderingHints/VALUE_ANTIALIAS_ON)
          (add-hint RenderingHints/KEY_COLOR_RENDERING     RenderingHints/VALUE_COLOR_RENDER_QUALITY)
          (add-hint RenderingHints/KEY_DITHERING           RenderingHints/VALUE_DITHER_DISABLE)
          (add-hint RenderingHints/KEY_RENDERING           RenderingHints/VALUE_RENDER_QUALITY)
          (add-hint RenderingHints/KEY_STROKE_CONTROL      RenderingHints/VALUE_STROKE_PURE)
          (add-hint RenderingHints/KEY_FRACTIONALMETRICS   RenderingHints/VALUE_FRACTIONALMETRICS_ON)
          (add-hint RenderingHints/KEY_TEXT_ANTIALIASING   RenderingHints/VALUE_TEXT_ANTIALIAS_OFF))
        (.setRenderingHints renderer hints)
        renderer))))

这会产生警告

可视化警告,metabase/pulse/render/poc.clj:104:37 - 无法解决对字段createRenderer的引用。

Clojure文档给出了“使用typehint this”作为解决方案。在proxy-super上方添加^PNGTranscoder this this并不能解决问题,但它表明代码有更多信息。

可视化警告,metabase/pulse/render/poc.clj:105:37 - 无法解决在org.apache.batik.transcoder.image.PNGTranscoder上对字段createRenderer的引用。

(在包含新的typehinted this绑定的105行中,104行变为105行)

1 个答案

+1

在 PNGTranscoder 中,createRenderer 方法是受保护的,但在生成的代理类中是公共的,因此无法非反射性调用,除非 this 使用代理的具体类型提示(这是一个巨大的 hack,但可能在技术上可行),但通过反射调用它,这使用代理的运行时类型,因此可以访问该方法,工作效率正常。

...