python rgba_Python:PIL替换单个RGBA颜色

I have already taken a look at this question: SO question and seem to have implemented a very similar technique for replacing a single color including the alpha values:

c = Image.open(f)

c = c.convert("RGBA")

w, h = c.size

cnt = 0

for px in c.getdata():

c.putpixel((int(cnt % w), int(cnt / w)), (255, 0, 0, px[3])) cnt += 1

However, this is very slow. I found this recipe out on the interwebs, but have not had success using it thus far: recipe

What I am trying to do is take various PNG images that consist of a single color, white. Each pixel is 100% white with various alpha values, including alpha = 0. What I want to do is basically colorize the image with a new set color, for instance #ff0000<00-ff>. SO my starting and resulting images would look like this where the left side is my starting image and the right is my ending image (NOTE: background has been changed to a light gray so you can see it since it is actually transparent and you wouldn't be able to see the dots on the left.)

Any better way to do this?

解决方案

If you have numpy, it provides a much, much faster way to operate on PIL images.

E.g.:

import Image

import numpy as np

im = Image.open('test.png')

im = im.convert('RGBA')

data = np.array(im) # "data" is a height x width x 4 numpy array

red, green, blue, alpha = data.T # Temporarily unpack the bands for readability

# Replace white with red... (leaves alpha values alone...)

white_areas = (red == 255) & (blue == 255) & (green == 255)

data[..., :-1][white_areas.T] = (255, 0, 0) # Transpose back needed

im2 = Image.fromarray(data)

im2.show()

Edit: It's a slow Monday, so I figured I'd add a couple of examples:

Just to show that it's leaving the alpha values alone, here's the results for a version of your example image with a radial gradient applied to the alpha channel:

Original:

Result:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值