Is Image.point() the right tool for
this job?
Yes indeed, Image.point()
is perfect for this job
What format/structure does
Image.point() expect the table?
You should flatten the list so instead of [(12, 140, 10), (10, 100, 200), ...]
use:
[12, 140, 10, 10, 100, 200, ...]
Here is a quick example I just tried:
im = im.point(range(256, 0, -1) * 3)
And by the way, if you need more control over colors and you feel Image.point is not for you you can also use Image.getdata
and Image.putdata
to change colors more quickly than both load
and putpixel
. It is slower than Image.point
though.
Image.getdata
gives you the list of all pixels, modify them and write them back using Image.putdata
. It is that simple. But try to do it using Image.point
first.
EDIT
I made a mistake in the first explanation, I'll explain correctly now:
The color table actually is like this
[0, 1, 2, 3, 4, 5, ...255, 0, 1, 2, 3, ....255, 0, 1, 2, 3, ...255]
Each band range next to the other.
To change the color (0, 0, 0) to (10, 100, 10) it need to become like this:
[10, 1, 2, 3, 4, 5, ...255, 100, 1, 2, 3, ....255, 10, 1, 2, 3, ...255]
To transform your color list into the right format try this:
table = sum(zip(*colors), ())
I think my first example should demonstrate the formate for you.