我有一个 RGB 图像,并试图将我的 RGB 上的每个像素设置为黑色,其中相应的 alpha 像素也为黑色。所以基本上我正在尝试将 alpha“烘焙”到我的 RGB 中。我已经尝试过使用 PIL 像素访问对象、PIL ImageMath.eval 和 numpy 数组:
PIL 像素访问对象:
def alphaCutoutPerPixel(im): 像素 = im.load() 对于范围内的 x(im.size[0]): 对于范围内的 y(im.size[1]): px = 像素[x, y] r,g,b,a = 像素 if px[3] == 0: # 如果 alpha 为黑色... 像素[x,y] = (0,0,0,0) 返回我
PIL ImageMath.eval:
def alphaCutoutPerBand(im): 新乐队 = [] r, g, b, a = im.split() 对于 (r, g, b) 中的波段: out = ImageMath.eval("convert(min(band, alpha), 'L')", band=band, alpha=a) newBands.append(out) newImg = Image.merge("RGB", newBands) 返回新图片
numpy 数组:
def alphaCutoutNumpy(im): 数据 = numpy.array(im) r, g, b, a = 数据.T blackAlphaAreas = (a == 0) # 这失败了;为什么? 数据[..., :-1][blackAlphaAreas] = (0, 255, 0) 返回 Image.fromarray(数据)
第一种方法效果很好,但速度很慢。第二种方法适用于单个图像,但在要求转换多个图像时会在第一种方法之后停止。我基于此示例创建的第三种方法(第一个答案):Python:PIL replace a single RGBA color 但在标记命令处失败:
data[..., :-1][blackAlphaAreas] = (0, 255, 0, 0)
IndexError: index (295) out of range (0<=index<294) in dimension 0
Numpy 似乎对这类东西很有希望,但我并没有真正了解如何一步设置数组部分的语法。有什么帮助吗?也许其他想法可以快速实现我上面描述的内容?
干杯