Python: PIL заменяет один цвет RGBA - PullRequest
18 голосов
/ 20 сентября 2010

Я уже взглянул на этот вопрос: ТА вопрос и, похоже, реализовал очень похожую технику для замены одного цвета, включая значения альфа:

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                                                                                                   

Однакоэто очень медленно.Я нашел этот рецепт на паутинах, но до сих пор не смог его использовать.

Я пытаюсь сделать различные PNG-изображения, состоящие из одного цвета, белого,Каждый пиксель на 100% белый с различными значениями альфа, включая альфа = 0. Что я хочу сделать, это в основном раскрасить изображение новым заданным цветом, например # ff0000 <00-ff>.Поэтому мое начальное и получающееся изображения будут выглядеть так, где левая сторона - это мое начальное изображение, а правая - мое конечное изображение (ПРИМЕЧАНИЕ: фон был изменен на светло-серый, поэтому вы можете видеть его, так как он на самом деле прозрачныйя не вижу точек слева.)

alt text

Есть ли лучший способ сделать это?

Ответы [ 3 ]

45 голосов
/ 20 сентября 2010

Если у вас есть numpy, он обеспечивает гораздо более быстрый способ работы с изображениями PIL.

например:.

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: это медленный понедельник, поэтому я решил добавить пару примеров:

Просто чтобы показать, что он оставляет значения альфа-канала в покое, вот результаты для версии вашего примера изображения с радиальным градиентом, примененным к альфа-каналу:

Оригинал: alt text

Результат: alt text

6 голосов
/ 22 сентября 2010

Попробуйте, в этом примере мы устанавливаем черный цвет, если цвет не белый.

#!/usr/bin/python
from PIL import Image
import sys

img = Image.open(sys.argv[1])
img = img.convert("RGBA")

pixdata = img.load()

# Clean the background noise, if color != white, then set to black.

for y in xrange(img.size[1]):
    for x in xrange(img.size[0]):
        if pixdata[x, y] == (255, 255, 255, 255):
            pixdata[x, y] = (0, 0, 0, 255)

Вы можете использовать палитру цветов в GIMP для поглощения цвета и увидеть, что это цвет RGBA

3 голосов
/ 20 сентября 2010

В главе онлайновой книги Pythonware PIL для модуля Image указано, что метод putpixel () работает медленно, и предполагается, что его можно ускорить путем встраивания. Или, в зависимости от версии PIL, используйте load ().

...