Python 如何使用PIL保存具有3个以上通道的图像?

Python 如何使用PIL保存具有3个以上通道的图像?,python,python-imaging-library,alpha,channels,Python,Python Imaging Library,Alpha,Channels,我需要用4个通道保存tiff图像,特别是R、G、B和a通道 当我尝试使用Image.save()保存带有4个通道的tiff时,生成的图像是RGBA图像,但在Photoshop中检查tiff时,只有RGB通道,没有Alpha通道。有没有办法将4个通道与第4个通道(单独的alpha通道)合并为RGBA图像 下面是我尝试过的一个例子 from PIL import Image # import image A inputImageA = Image.open(input_imageA_path)

我需要用4个通道保存tiff图像,特别是R、G、B和a通道

当我尝试使用
Image.save()
保存带有4个通道的tiff时,生成的图像是RGBA图像,但在Photoshop中检查tiff时,只有RGB通道,没有Alpha通道。有没有办法将4个通道与第4个通道(单独的alpha通道)合并为RGBA图像

下面是我尝试过的一个例子

from PIL import Image

# import image A
inputImageA = Image.open(input_imageA_path)

# import image B
inputImageB = Image.open(input_imageB_path)

# split channels
R, G, B, A = inputImageA.split()
alpha_channel = inputImageA.split()[-1]

# merge 4 channels back into a single image
outputImage = Image.merge("RGBA", [R,G,B,alpha_channel])

# save the new image
outputImage.save(ouput_image_path)
在此示例中,生成的输出图像只有3个通道(RGB)

请参见下图,以了解我尝试执行的操作的视觉解释:


更新答案

好吧,我想你现在的意思是:

#!/usr/bin/env python3

from PIL import Image

# Open background image, ensuring RGB
im = Image.open('start.png').convert('RGB')

# Open alpha channel, ensuring single channel
alpha = Image.open('alpha.png').convert('L')

# Add that alpha channel to background image
im.putalpha(alpha)

# Save as TIFF
im.save('result.tif')
这使得
start.png

plus
alpha.png

进入
结果.tif

原始答案

以下是创建和保存4通道RGBA TIFF的简单示例:

#!/usr/bin/env python3

from PIL import Image, ImageDraw

# Create RGB image full of yellow
w, h = 640, 480
im =Image.new('RGB',(w,h),color=(255,255,0))

# Create alpha channel of white i.e. opaque
alpha =Image.new('L',(w,h),color=255)

# Get drawing context to draw into alpha channel and draw black (i.e. transparent) rectangle
d = ImageDraw.Draw(alpha)
d.rectangle([10,40,200,250],fill=0)

# Add that alpha channel to yellow image
im.putalpha(alpha)

# Save as TIFF
im.save('result.tif')

我用OpenCV2库而不是PIL解决了这个问题。请看下面我是如何做到这一点的:

import cv2

# read original image
original = cv2.imread(original_image_path, cv2.IMREAD_UNCHANGED)

# get dimensions for resizing mask
height, width, channels = original.shape

# read alpha image
alpha = cv2.imread(alpha_path)

# resize alpha image to match original
alpha_resized = cv2.resize(alpha, (height,width))

# split alpha_resized into individual channels
channels = cv2.split(alpha_resized)

# apply to 4th channel of original
original[:,:,3] = channels[0]

# write new image file with alpha channel
cv2.imwrite(output_path,original)

嗨,马克!谢谢你的回复,但这不是我想要的。也许我不是很清楚,所以请看下面的图片,以更直观地解释我正在尝试做什么。好的,对不起,我又试了一次!没问题!再次感谢您的快速回复。但仍然不是我想要的。我要寻找的是最终图像中的RBG通道在结果图像中根本不起作用。相反,我希望alpha通道作为一个新通道简单地添加到结果图像中,类似于在photoshop中为RBG图像单击“创建新通道”,然后简单地将alpha通道粘贴到创建的新通道中。我甚至不确定这在PIL中是否可行,但我希望这能让事情变得更清楚一点!所以你想要一个4通道TIFF,其中第4通道不是alpha!如果是这样,请看这里。。。这里是的,没错!谢谢,我会查看这些链接请自答,不要把你的答案放在问题中。