Python Pillow v2.6.0 paletted PNG (256) How to add

2019-04-10 03:53发布

问题:

I have a numpy array that is written to an image, a RGB colormap added as a palette, and all that remains is a transparency channel (256 values) on top. I have tried converting to RGBA, LA, and other ways around it but, I cannot figure out how to add this multi-value channel on top as a palette.

Here is an example that I have that adds a single-value channel of transparency:

# data = numpy array 1624x3856
im = Image.fromarray(data)
im = im.convert('P')
# cmap is a 768-valued RGB array
im.putpalette(my_cmap)
im.save('filename.png', transparency=0)

The channel I want to save is as follows:

# len(alpha) = 256
alpha = [0,255,255,255...255,255,255]

Any help would be greatly appreciated.

回答1:

Prepare a correct RGBA format for working with an Alpha-channel

After preparing the RGB-part ( as an issue seen from the data.shape above ) your raster-image will have to get the corresponding Alpha-layer.

To do that, add a call to an instance method

Image.putalpha( anAlphaLAYER )

That adds / replaces the alpha-layer in your image. If the image does not have an alpha layer, it’s converted to LA or RGBA, so have the RGB-part ready before call to this method. The new layer ( anAlphaLAYER ) must be either L or 1.

So be sure to have anAlphaLAYER.shape matching your im.size ( X, Y ). Another possibility is to create alpha-layer from an integer value and modify it's cell-values ad-hoc.

Having done the full RGBA-format as early as in the numpy.array, the whole issue would not make you any troubles.



回答2:

Here is a simple example on how to ensure a Pillow image is RGBA :

img = Image.open("SOME_RGB_IMAGE.png")

if img.mode == "RGB":
    a_channel = Image.new('L', img.size, 255)   # 'L' 8-bit pixels, black and white
    img.putalpha(a_channel)


标签: python pillow