【问题标题】:set alpha for bitmap in racket为球拍中的位图设置 alpha
【发布时间】:2014-07-06 11:15:07
【问题描述】:
所以,我正在使用函数将位图图像分配给对象
(define (make-enemy-alienship bitmap-target)
(let ((dc (new bitmap-dc% [bitmap bitmap-target])))
(send dc draw-bitmap (read-bitmap "alien.bmp") 0 0)))
我希望图像中的白色像素是透明的,但我认为文档没有多大帮助。是否应该对 mask 参数进行一些处理?另外,你怎么知道哪个位图会“在上面”?例如,如果我想要一个背景图片,我显然希望它位于底部。
提前致谢。
【问题讨论】:
标签:
bitmap
scheme
racket
transparent
alpha
【解决方案1】:
如果我理解正确,您的位图不包含透明度通道,并且您想使用白色值来表示透明度。
有一个更好的解决方案,但是如果你不想修改你的图像文件(并且坚持使用没有alpha通道的.bmp),你可以使用get-argb-pixels和set-argb-pixels在像素时将alpha通道修改为1是白色的 (255, 255, 255)。
另一种可能性是将您的图像保存为png 格式,同时将背景颜色设置为白色(顺便说一句,我建议使用不太常见的颜色,如紫色,否则您将无法在图像中使用白色像素)。这是在任何体面的图像编辑器中完成的。然后您可以在read-bitmap 的kind 参数中使用png/mask 加载带有“掩码”的bitmap%。
我推荐的另一种方法是使用具有 Alpha 通道的图像文件,并使用bmp/alpha 加载它(对于.bmp 文件)。通常使用带有 alpha 通道的 png 格式(png 文件类似于 bmp 文件,但压缩后不会丢失)。您现在可以使用任何透明度值,例如 50%,这很好地避免了粗糙的边缘。
关于哪个图像将在顶部,(send dc draw-bitmap bmp) 将始终在 dc 中已绘制的内容之上绘制 bmp,因此您在此处使用它的方式很好。
侧边:
-
您不应该在make-enemy-alienship 中调用read-bitmap,因为调用read-bitmap 的开销很大(它会打开一个文件,分配一些内存缓冲区,将文件复制到缓冲区中,然后关闭文件)。相反,您应该将(read-bitmap "alien.bmp") 的结果保存到变量中:
(define alien-bmp (read-bitmap "alien.bmp"))
(define (make-enemy-alienship bitmap-target)
(let ((dc (new bitmap-dc% [bitmap bitmap-target])))
(send dc draw-bitmap alien-bmp 0 0)))
您应该使用define-runtime-path 来避免取决于您当前目录的相对路径问题。但这不是您之前关心的问题,您可以稍后再处理,现在专注于在屏幕上显示漂亮的宇宙飞船。