简体   繁体   English

PIL将透明PNG加载为RGB吗?

[英]PIL Loading a Transparent PNG as RGB?

I'm trying to use PIL to composite some aerial imagery and running into some trouble. 我正在尝试使用PIL合成一些航拍图像并遇到一些麻烦。 I use PIL to load this image with this little bit of code: 我使用PIL用以下代码加载此图像

composite = Image.new('RGBA', (256, 256))
url = 'http://...'
resp = requests.get(url)
content = StringIO(resp.content)
image = Image.open(content)
composite.paste(image, (0, 0), image)

When I make the call to composite.paste() , PIL gives me the error "ValueError: bad transparency mask". 当我调用composite.paste() ,PIL给我错误“ ValueError:错误的透明蒙版”。 When I print image.mode , sure enough it's simply RGB instead of the expected RGBA (which paste() requires). 当我打印image.mode ,请确保它只是RGB而不是预期的RGBApaste()要求)。

Where does the alpha channel on my downloaded PNG go? 我下载的PNG上的Alpha通道在哪里?

The below code is working for me: 下面的代码为我工作:

from PIL import Image
import requests
import StringIO

url = "https://gis.apfo.usda.gov/arcgis/rest/services/NAIP/Tennessee_2016_60cm/ImageServer/exportImage?bbox=-87.1875,34.3071438563,-84.375,36.5978891331&bboxSR=4326&size=256,256&imageSR=102113&transparent=true&format=png&f=image"
resp = requests.get(url)
content = StringIO.StringIO(resp.content)
image = Image.open(content)
image = image.convert('RGBA')
composite = Image.new("RGBA", image.size, (255,255,255,0))
composite.paste(image )

As far as I can see it, the image is RGBA . 据我所知,图像是RGBA Look at the result of 看一下结果

$ convert exportImage.png -verbose info

Image: exportImage.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 256x256+0+0
  Units: Undefined
  Type: TrueColorAlpha
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
    alpha: 1-bit

Channel statistics:
    Pixels: 65536
    Red:
      min: 39 (0.152941)
      max: 253 (0.992157)
      mean: 133.019 (0.521641)
      standard deviation: 75.3931 (0.295659)
      kurtosis: -1.05835
      skewness: 0.86831
    Green:
      min: 59 (0.231373)
      max: 253 (0.992157)
      mean: 152.489 (0.597998)
      standard deviation: 62.9948 (0.247038)
      kurtosis: -1.03932
      skewness: 0.87929
    Blue:
      min: 39 (0.152941)
      max: 253 (0.992157)
      mean: 135.817 (0.532617)
      standard deviation: 72.8752 (0.285785)
      kurtosis: -1.01856
      skewness: 0.929917
    Alpha:
      min: 0 (0)
      max: 255 (1)
      mean: 185.273 (0.726562)
      standard deviation: 113.659 (0.445723)
      kurtosis: -0.966513
      skewness: 1.01661
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 122.763 (0.481424)
      standard deviation: 83.4891 (0.327408)
      kurtosis: -0.482848
      skewness: 0.432253
  Alpha: srgba(253,253,253,0)   #FDFDFD00  --------> (1)

and so on. 等等。

Now, let's load the image using PIL and Python 3: 现在,让我们使用PIL和Python 3加载图像:

from PIL import Image
from io import BytesIO

url = "..."
resp = requests.get(url)
cont = BytesIO(resp.content)
img = Image.open(cont)
comp = Image.new('RGBA', (256, 256), (255, 255, 255, 0))  # 0 for transparency
comp.paste(img, (0, 0))

It's because of eqn (1) in above image statistics we've to give 0 also when making a new image. 由于上述图像统计信息中的eqn(1),我们在制作新图像时也必须给出0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM