在图像目录中交换R和B颜色通道值?蟒蛇

vet*_*eta 5 python image-manipulation colors python-imaging-library

我有一个很大的截图目录.傻傻的我没有检查它们是否出色,并发现VLC有FRAPS True RGB的错误.幸运的是,似乎可以修复,看起来唯一的问题是R和B通道是交换的.

使用python的PIL我想为每个图像抓取每个像素的红色和蓝色值,然后重新插入它们.

我知道如何遍历目录,所以我缺少的主要部分是交换值的最佳方式.我想我可以用像素为像素,但也许有更多的pythonic方式,也许在一个命令中将它们全部打包?

任何示例代码或链接将非常感谢!

Ber*_*Ber 5

基于@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 图像。


vet*_*eta 1

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)