vet*_*eta 5 python image-manipulation colors python-imaging-library
我有一个很大的截图目录.傻傻的我没有检查它们是否出色,并发现VLC有FRAPS True RGB的错误.幸运的是,似乎可以修复,看起来唯一的问题是R和B通道是交换的.
使用python的PIL我想为每个图像抓取每个像素的红色和蓝色值,然后重新插入它们.
我知道如何遍历目录,所以我缺少的主要部分是交换值的最佳方式.我想我可以用像素为像素,但也许有更多的pythonic方式,也许在一个命令中将它们全部打包?
任何示例代码或链接将非常感谢!
基于@veta 的回答,通过处理颜色通道而不是单个像素可以大大加快该过程:
在每个文件的循环中,通道可以这样交换:
r, g, b = im_rgb.split()
im_rgb = Image.merge('RGB', (b, g, r))
Run Code Online (Sandbox Code Playgroud)
只需使用这两行而不是 veta 答案中的嵌套循环。这应该运行得更快。
此解决方案首先用于Image.split()创建三个独立的图像,每个 R、G、B 通道一个。然后Image.merge()用于创建具有交换的 R 和 B 通道的新 RGB 图像。
import os
from PIL import Image
dirPath = r"D:\Fraps\Movies\Screens"
dirList = os.listdir(dirPath)
outPath = r"D:\Fraps\Movies\Screens\Output"
for (dirname, dirs, files) in os.walk(dirPath):
for filename in files:
if filename.endswith('.png'):
print("Opening:"+filename)
thefile = os.path.join(dirname,filename)
im = Image.open(thefile)
#im.load()
width, height = im.size
im_rgb = im.convert('RGB')
for x in range(0, width):
for y in range(0,height):
r, g, b = im_rgb.getpixel((x, y))
im_rgb.putpixel((x, y), (b, g, r))
print("Saving:"+filename)
#outfile, ext = os.path.splitext(infile)
outfile = os.path.join(outPath,filename)
im_rgb.save(outfile, "PNG")
print("Ding!")
Run Code Online (Sandbox Code Playgroud)