我试图在黑色背景上显示具有透明度的png图像,在表面上缓慢移动它,但是很多帧包含白色像素。 (根本不应该存在)
徽标表面的创建方式如下:
self.logo_surface = cairo.ImageSurface.create_from_png(image)
每一帧都是这样绘制的: 我将其移动到一个新位置,然后将图像缩小到15x15px
def draw(self, ctx):
# scale image and move it to a right place
ctx.save()
ctx.translate(self.left, self.top)
ctx.scale(self.scale_xy, self.scale_xy)
ctx.set_source_surface(self.logo_surface)
#Here i tried different filters but without improvement in reducing white flashes
ctx.get_source().set_filter(cairo.FILTER_FAST)
ctx.paint()
ctx.restore()
left,top,scale_xy是float。左侧和顶部每帧都会改变一点。
我怎么能防止那些闪光?
修改
1)使用get_data提取最终表面的数据。
buf = self.surface.get_data()
a = numpy.frombuffer(buf, numpy.uint8)
2)当translate被赋予整数值时,不会发生这种效果:
ctx.translate(int(self.left), int(self.top))
然后图像在100x100px表面上不再平滑移动
答案 0 :(得分:0)
维基媒体徽标在透明和彩色部分之间包含一些白色像素。因为它是一幅大图,除非放大得非常近,否则无法看到它。如果用cairo缩小尺寸,它有时会使用那些“白色”像素值 - 因此在图像上闪烁白色像素。