白色闪烁在开罗的透明图像边缘

时间:2014-08-05 10:59:39

标签: python png cairo pycairo

我试图在黑色背景上显示具有透明度的png图像,在表面上缓慢移动它,但是很多帧包含白色像素。 (根本不应该存在)

white pixel on wikimedia logo

徽标表面的创建方式如下:

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表面上不再平滑移动

1 个答案:

答案 0 :(得分:0)

维基媒体徽标在透明和彩色部分之间包含一些白色像素。因为它是一幅大图,除非放大得非常近,否则无法看到它。如果用cairo缩小尺寸,它有时会使用那些“白色”像素值 - 因此在图像上闪烁白色像素。