[Image-SIG] PIL and swapping colors

loz.accs loz.accs at gmail.com
Fri Nov 5 17:55:55 CET 2010

Thanks for reply, Anders!

I found Xlib Visual structure that contains color masks. Actually
masks was normal RGB:
R=0xFF0000, G=0xFF00 and B=0xFF.

Swapping R and B masks gave me necessary result.
By some strange resons X RGB image converts to PIL BRG image, in
Image.fromstring I think, and BRG accordingly to RGB =)

Anyway now all screenshot will have the right color masks.

2010/11/5, Anders Sandvig <anders.sandvig at gmail.com>:
> On Fri, Nov 5, 2010 at 7:16 AM, loz.accs <loz.accs at gmail.com> wrote:
>> [...]
>> Image object (Image.fromstring) was created successfully, but red and
>> blue colors was swapped.
>> So my question: is there any way to swap colors in image using PIL?
> My naive (and slow) implementation would be something like this (code not
> tested):
> def swap(image):
>     width, height = image.size()
>     res = Image.new("RGBA", (width, height))
>     data1 = image.load()
>     data2 = res.load()
>     for y in range(height):
>         for x in range(width):
>             r, g, b, a = data1[x, y]
>             data2[x, y] = (b, g, r, a)
>     del image
>     return res
> However, be aware that even if the format is BGRx on your machine doesn't
> mean it's the same on a different machine (or even on your machine with a
> different resolution), as the screen format will depend on the graphics card
> and
> driver.
> Usually the drivers will have a way to tell which format the screen is in
> (i.e.
> RGBx or BGRx), so I advice you to check the format and pass this information
> on
> to the Python code, or convert it to RGBx before handing the image buffer
> over
> to Python.
> Anders

More information about the Image-SIG mailing list