我正在尝试使用 Racket “2htdp/image”翻转图像列表。
这是一个不起作用的最小示例:
#lang racket
(require 2htdp/image)
(define images
(list
(bitmap "../data/player/player1.png")
(bitmap "../data/player/player2.png")
(bitmap "../data/player/player3.png")))
(define flipped (map flip-horizontal images))
在我看来(由于在 DrRacket 中绘制图像的速度)列表“翻转”的内容被延迟评估。这意味着只有在我尝试访问图像时才会计算其翻转版本。一旦我将此 Racket 文件导入 Universe(使用“2htdp/universe”),这就会成为一个问题,因为我最初在使用翻转图像时性能不佳。
我查看了 implementation “水平翻转”,我看不出任何明显的原因。不过,我还没有研究“make-translate”和“make-image”的实现。
我无法使用强制强制计算图像,调试器显示 object:image 作为列表内容。我不确定究竟发生了什么,以及如何防止这个问题并在启动时实际计算所有图像。
知道为什么会发生这种情况和/或如何正确解决它吗?谢谢。
批准的答案是我的问题的解决方案,所以我最后只是将最后一行更改为:
(define flipped (map (compose freeze flip-horizontal) images))
最佳答案
您说得对,直到显示图像内容时才实际计算图像内容。您可以使用 freeze
,如果您需要提前计算图像,它会将图像转换为位图。
在您的示例中,尝试将 flipped
的定义更改为以下内容:
(define flipped (map (compose1 freeze flip-horizontal) images))
关于image - 翻转图像似乎使用惰性评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25065757/