gpt4 book ai didi

Python枕头从像素制作gif

转载 作者:行者123 更新时间:2023-12-04 10:30:45 25 4
gpt4 key购买 nike

enter image description here

我有图像和蓝色像素列表。我想遍历蓝色像素,将它们更改为红色并从中制作 gif。所以它一定是一条线,因此颜色从蓝色变为红色,但出了点问题

im = Image.open(r"test2.png")
pixels = im.load()
images = []
blues = get_sorted_blues() # See func below

for x, y in blues:
...: pixels[x, y] = (255, 0, 0)
...: images.append(im)

images[0].save('result.gif',
...: save_all=True,
...: append_images=images[1:],
...: duration=100,
...: loop=0)

def get_sorted_blues():
...: blues = []
...: for x in range(im.width):
...: for y in range(im.height):
...: if pixels[x, y] == (0, 0, 255):
...: blues.append([x, y])
...: return sorted(blues)

result.gif 它只是一条红线,没有任何动画

最佳答案

有很多方法可以使蓝色像素变为红色 - 并使用 for循环在性能、可读性、可维护性方面排名靠后。

这是使用“颜色矩阵”来交换红色和蓝色 channel 的一个:

from PIL import Image

# Open image
im = Image.open('lines.png')

# Define color matrix to swap the red and blue channels
# This says:
# New red = 0*old red + 0*old green + 1*old blue + 0offset
# New green = 0*old red + 1*old green + 0*old blue + 0offset
# New blue = 1*old red + 0*old green + 0*old blue + 0offset
Matrix = ( 0, 0, 1, 0,
0, 1, 0, 0,
1, 0, 0, 0)

# Apply matrix
result = im.convert("RGB", Matrix)

enter image description here

这比 for 快大约 40 倍循环。在我的机器上需要 1.07 毫秒,而使用 for 需要 40 毫秒循环。

这是一个使用 Numpy 查找蓝色像素并将它们变为红色的方法:
import numpy as np
from PIL import image

# Open image and make Numpy version
im = Image.open('lines.png')
na = np.array(im)

# Make all blue pixels red
na[ np.all(na[:,:]==[0,0,255], axis=2) ] = [255,0,0]

# Convert back to PIL Image
result = Image.fromarray(na)

这在 5ms 时快了大约 8 倍。

这是一个使用 Numpy 将 RGB 排序反转为 BGR 的示例:
import numpy as np
from PIL import image

# Open image and make Numpy version
im = Image.open('lines.png')
na = np.array(im)

# Reverse channel ordering i.e. RGB -> BGR
BGR = na[...,::-1]

# Convert back to PIL Image
result = Image.fromarray(BGR)

这在 4.4 毫秒时快了大约 9 倍。

这是我们使用 PIL 将图像拆分为其组成的 RGB channel ,然后以相反的顺序将它们合并回来的一种方式:
from PIL import Image

# Open image
im = Image.open('lines.png')

# Split into R, G, B channels
R, G, B = im.split()

# Recombine in B, G, R order
result = Image.merge('RGB',(B,G,R))

这在 371 微秒时快了大约 100 倍。

关于Python枕头从像素制作gif,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60427819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com