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.
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.
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)