Closed ChillRainQ closed 1 week ago
之前尝试过 glReadPixels
,当时也是读取值和实际值不一样,但是现在不能复现了。
像素检测的轮廓图:
感谢回复以及提供的测试代码。测试代码中的使用self.isInLA进行判断点击位置是否在L2d区域。其中的判断方法
def isInL2DArea(self, click_x, click_y):
h = self.height()
alpha = gl.glReadPixels(click_x, h - click_y, 1, 1, gl.GL_RGBA, gl.GL_UNSIGNED_BYTE)[3]
return alpha > 0
和我提供的方法功能是一致的,在你提供的代码中,点击可以拖动的位置与我的实现是几乎完全相同的。
你提到了不能复现,我不明白具体情况,相同的代码,在我这里依旧是获取到了不准确的alpha值。这可能和具体设备有关系?我认为可能性不大。
代码中绘制的边缘检测被我更改为:不透明区域使用红色,结果图与您的几乎相同(虽然缺少了头)。但是这大概就是原因,因为我的图像是400*600的,从glReadPixels
中获取到的图像形状是与渲染出来的形状完全对不上的,即缓冲区中的角色与桌面显示的角色大小不同。
def savePng(self, fName):
data = gl.glReadPixels(0, 0, self.width(), self.height(), gl.GL_RGBA, gl.GL_UNSIGNED_BYTE)
data = np.frombuffer(data, dtype=np.uint8).reshape(self.height(), self.width(), 4)
data = np.flipud(data)
new_data = np.zeros_like(data)
for rid, row in enumerate(data):
for cid, col in enumerate(row):
if col[3] != 0:
new_data[rid][cid] = [255, 0, 0, 255]
img = Image.fromarray(new_data, 'RGBA')
img.save(fName)
下面是获取到的透明度不为0的区域图像: 下面是显示图像与上图的对比图:
原因应该是读取到的位置实际上有偏移,我点击了一些位置进行了测试,原因就是显示的图像所对应的透明度图像不正确,但目前不知道原因。实际原因是操作系统问题,操作系统中设置了缩放,导致了该问题,您可以尝试修改缩放。然后重复该过程,应该可以得到相同的结果。 经过测试,实际获取鼠标点击位置的像素信息需要经过如下变换才可以获取到正确坐标信息:
x = x * systemScale
y = (height - y) * systemScale
systemScale为系统的缩放因子
使用Pyside6中的QOpenGLWidget显示live2d,实现透明区域鼠标事件忽略效果,在点击部分透明位置时获取到的alpha通道不为0,而一部分渲染了live2d的位置alpha通道为零。 下面是我的检测透明度的方法:
使用的模型为nn。 python版本为3.12。 windows11操作系统。 live2d.v3