一通道的图片都是灰色的吗?

最近在做一个图片算法

遇到一个问题,就是下面这个图片使用 python 的 PIL 图监测是一通道的

但是这个图片是彩色的,而且背景是透明的,但却是一个 jpg 图片

图片.png

图片.png

为什么?

  • 我一直以为,只有 png 可以有透明图层,jpg 是不行的?
  • 一通道不是灰色图片的意思吗?这个老虎图明显是彩色的呀

我使用 python 的 PIL 库,将老虎图转成 RGB 的时候,会有警告

image_path = 'tiger.jpg'

image = Image.open(image_path)

image = image.convert('RGB')
/Users/ponponon/.local/share/virtualenvs/image2vector-n-kX1tX6/lib/python3.8/site-packages/PIL/Image.py:979: UserWarning: Palette images with Transparency expressed in bytes should be converted to RGBA images
  warnings.warn(

图片.png

大概意思就是说,indexed image 应该转成 RGBA 而不是 RGB

为什么呢?

是因为 indexed image 都应该转成 RGBA,还是带有透明图层的 indexed image 应该转成 RGB 呢?

我知道 png 可以是 indexed image。另外,jpg、bmp、tif 等等也可以是 indexed image 吗?
阅读 3.9k
3 个回答

从你的问题下载下来的图片就是 png。用 ImageMagick 看到是有 Alpha 通道的 PNG 。

详细结果如下:

Image:
  Filename: .\4262587185-63c3c47210ff5_fix732.png
  Permissions: rw-rw-rw-
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 732x732+0+0
  Units: Undefined
  Colorspace: sRGB
  Type: TrueColorAlpha
  Base type: Undefined
  Endianness: Undefined
  Depth: 8-bit
  Channel depth:
    Red: 8-bit
    Green: 8-bit
    Blue: 8-bit
    Alpha: 8-bit
  Channel statistics:
    Pixels: 535824
    Red:
      min: 0  (0)
      max: 255 (1)
      mean: 101.039 (0.39623)
      median: 0 (0)
      standard deviation: 117.392 (0.460361)
      kurtosis: -1.75995
      skewness: 0.380136
      entropy: 0.394036
    Green:
      min: 0  (0)
      max: 255 (1)
      mean: 73.0801 (0.286588)
      median: 0 (0)
      standard deviation: 91.6676 (0.359481)
      kurtosis: -1.32072
      skewness: 0.660874
      entropy: 0.533105
    Blue:
      min: 0  (0)
      max: 255 (1)
      mean: 45.056 (0.17669)
      median: 0 (0)
      standard deviation: 62.3526 (0.24452)
      kurtosis: 0.61862
      skewness: 1.23226
      entropy: 0.531897
    Alpha:
      min: 0  (0)
      max: 255 (1)
      mean: 109.235 (0.428374)
      median: 0 (0)
      standard deviation: 125.683 (0.492876)
      kurtosis: -1.91048
      skewness: 0.289578
      entropy: 0.164093
  Image statistics:
    Overall:
      min: 0  (0)
      max: 255 (1)
      mean: 82.1025 (0.321971)
      median: 0 (0)
      standard deviation: 99.2739 (0.38931)
      kurtosis: -1.24603
      skewness: 0.722574
      entropy: 0.405783
  Alpha: none   #00000000
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Matte color: grey74
  Background color: white
  Border color: srgb(223,223,223)
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 732x732+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2023-01-15T09:56:32+00:00
    date:modify: 2023-01-15T09:56:32+00:00
    date:timestamp: 2023-01-15T11:40:49+00:00
    png:bKGD: chunk was found (see Background color, above)
    png:IHDR.bit-depth-orig: 8
    png:IHDR.bit_depth: 8
    png:IHDR.color-type-orig: 6
    png:IHDR.color_type: 6 (RGBA)
    png:IHDR.interlace_method: 0 (Not interlaced)
    png:IHDR.width,height: 732, 732
    signature: 19c926994c27c578cd655f6d1009e54be27db4caaf4db8bbbf6382f793a1920b
  Artifacts:
    verbose: true
  Tainted: False
  Filesize: 419058B
  Number pixels: 535824
  Pixel cache type: Memory
  Pixels per second: 21.2711MP
  User time: 0.016u
  Elapsed time: 0:01.025
  Version: ImageMagick 7.1.0-57 Q16-HDRI x64 eadf378:20221230 https://imagemagick.org

文件系统里显示的类型,有可能只是根据扩展名判断的,并没有读取实际的文件内容。jpg 扩展名的文件里面存一个 png ,大部分画图、显示的软件也都还是可以处理的

图像存储里,还有一种叫 indexed color 。他的图像数据只有一个通道,其中的数据并不是颜色值,而是指向一个调色板的索引。调色板也是存储在图片里的,其中记录了图片中使用的所有颜色。这种图片并不是黑白的。说图片颜色的时候,有时会有 64色,256色,都是这种。64色、256色就是调色板里有64种颜色或者256种颜色。现在硬件性能好了,这种格式已经几乎不用了。


大概意思就是说,indexed image 应该转成 RGBA 而不是 RGB

它的意思是,有 8 位透明度通道的图片应该转换成 RGBA 而不是 RGB 。透明度是存储在 Alpha 通道里的。


关于后一个补充,你其实应该问一个新问题的。你这样改问题,并不容易被人看到 ...

有可能是后缀名错了,比如说你用微信去传图片,png 的格式就会变成 .jpg 的,但是其实是 png 格式的是保留了透明通道的,重新修改后缀就可以了。
如果是直接保存成 jpg 的,就不会这样了,透明区域会变成白色的底色来压缩图片。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏