【问题标题】: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-pixelsset-argb-pixels在像素时将alpha通道修改为1是白色的 (255, 255, 255)。

    另一种可能性是将您的图像保存为png 格式,同时将背景颜色设置为白色(顺便说一句,我建议使用不太常见的颜色,如紫色,否则您将无法在图像中使用白色像素)。这是在任何体面的图像编辑器中完成的。然后您可以在read-bitmapkind 参数中使用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 来避免取决于您当前目录的相对路径问题。但这不是您之前关心的问题,您可以稍后再处理,现在专注于在屏幕上显示漂亮的宇宙飞船。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2012-03-17
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多