image - 翻转图像似乎使用惰性评估

标签 image racket lazy-evaluation

我正在尝试使用 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/

相关文章:

c# - 使用WarpAffine()将Emgu.CV.Image向右移动

apache-spark - SparkSQL 中的惰性求值

流与单子(monad)

haskell - 此列表如何理解其自身的单位?

c# - WCF 图像序列化

html - 使图像适合屏幕以避免滚动

php - 使用php文件上传错误

file - 在 SCHEME 中将数字相乘并将结果输出到文件中

performance - 方案中Streams的效率

regex - 如何使用变量作为正则表达式值?