使用Python Pillow库设置颜色深度

6 投票
2 回答
14642 浏览
提问于 2025-04-18 08:02

我正在使用Python的Pillow库来处理一张图片,然后再把它发送到设备上。
我需要对这张图片进行一些修改,以确保它符合以下要求:

  • 分辨率(宽 x 高)= 298 x 144
  • 灰度图
  • 颜色深度(位数)= 4
  • 格式 = .png

除了将颜色深度改为4位之外,我可以完成其他所有要求。
有没有人能告诉我该怎么做呢?

2 个回答

0

在ufp.image模块中使用changeColorDepth函数。

import ufp.image
import PIL
im = PIL.Image.open('test.png')
im = im.convert('L') # change to grayscale image
im.thumbnail((298, 144)) # resize to 294x144
ufp.image.changeColorDepth(im, 16) # change 4bits depth(this function change original PIL.Image object)
#if you will need better convert. using ufp.image.quantizeByImprovedGrayScale function. this function quantized image.
im.save('changed.png')

查看示例:通过改进的灰度进行图像量化。[Python]

6

到目前为止,我还没能用Pillow保存4位图像。你可以用Pillow来减少图像中的灰度级别,方法是:

import PIL.Image as Image
im = Image.open('test.png')
im1 = im.point(lambda x: int(x/17)*17)

假设test.png是一个8位灰度图像,也就是说它的像素值在0到255之间(im.mode == 'L'),那么im1现在只包含16个不同的值(0, 17, 34, ..., 255)。这也是ufp.image.changeColorDepth的作用。不过,你得到的还是一个8位的图像。所以,除了上面的做法,你可以这样做:

im2 = im.point(lambda x: int(x/17))

这样你最终得到的图像只包含16个不同的值(0, 1, 2, ..., 15)。这些值都可以放在一个uint4类型里。但是,如果你用Pillow保存这样的图像:

im2.save('test.png')

保存下来的png文件仍然是8位的颜色深度(如果你打开这个图像,你会看到只有非常暗的灰色像素)。你可以使用PyPng来保存一个真正的4位png:

import png
import numpy as np
png.fromarray(np.asarray(im2, np.uint8),'L;4').save('test4bit_pypng.png')

不幸的是,使用PyPng保存图像似乎要花费更长的时间。

撰写回答