在球拍中为位图设置alpha

时间:2014-05-18 12:12:42

标签: bitmap scheme racket transparent alpha

因此,我将位图图像分配给具有函数

的对象
(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参数完成某些操作?另外,你怎么知道哪个位图会在顶部'?例如,我是否想要背景图像,我显然希望它在底部。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您的位图不包含透明度通道,并且您希望将白色值用于透明度。 有一个更好的解决方案,但如果你不想修改你的图像文件(并坚持使用.bmp没有alpha通道),你可以使用get-argb-pixelsset-argb-pixels来修改alpha当像素为白色时,通道为1(255,255,255)。

另一种可能性是以png格式保存图像,同时将背景颜色设置为白色(顺便说一句,我建议使用不太常见的颜色,如紫色,否则你将无法使用白色图像中的像素)。这是在任何体面的图像编辑器中完成的。然后,您可以使用"掩码"加载bitmap%。在read-bitmappng/mask参数中使用kind

另一种方法,我推荐的方法是使用具有Alpha通道的图像文件,并使用bmp/alpha(用于.bmp个文件)加载它。通常将png格式与alpha通道一起使用(png文件类似于bmp文件,但压缩时不会丢失)。您现在可以使用任何透明度值,例如50%,这样可以避免粗糙边缘。

关于哪个图片位于顶部,(send dc draw-bitmap bmp)将始终在bmp已经绘制的内容上绘制dc,因此您在此处使用它的方式很好。< / p>

附注:

  • 您不应该在read-bitmap内调用make-enemy-alienship,因为调用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来避免相对路径问题,具体取决于您当前的目录。但这不是你先前关注的问题,你可以稍后处理,现在就把重点放在屏幕上有漂亮的太空飞船。