我使用python3.6.6和Pillow==5.3.0生成图像。所有图像都有“JPEG”格式和“RGB”颜色模式。在
当我用颜色制作图像时,它将以Type: TrueColor
(并且通道深度:红色:8位绿色:8位蓝色:8位)
当我只使用黑白时,它将以Type: Grayscale
(并且通道深度:gray:8位)输出
因为我尝试使用只接受彩色图像的打印服务,所以我想尝试使黑白图像成为TrueColor
图像,即使它们中没有任何其他(RGB)颜色。
我能简单地做这个吗?
或者,TrueColor
图像是否意味着RGB值不能全部为0?在
我不知道我怎么能在枕头里做这个。我的首选方法是在Python代码中生成图像时强制执行此操作。在
另一种方法是使用工具转换图像(我使用的是ubuntu18.04,我使用的是ImageMagick和ffmpeg)。我尝试了下面的方法,但似乎没有任何效果。输出文件具有与原始文件相同的元数据。在
convert -type TrueColor original_file.jpeg converted_file.jpeg
convert -type TrueColor -depth 8 original_file.jpeg converted_file.jpeg
下面是Python代码,用相同的模式(RGB)创建两个图像。在
^{pr2}$带有黑线的图像将有Type: Grayscale
,而红线为Type: TrueColor
。
注意,在这两种情况下,颜色空间都是sRGB,深度是8位。在
identify black_line.jpeg
black_line.jpeg JPEG 400x400 400x400+0+0 8-bit sRGB 5.12KB 0.000u 0:00.000
identify -verbose black_line.jpeg
Type: Grayscale
Colorspace: sRGB
Depth: 8-bit
Channel depth:
gray: 8-bit
identify red_line.jpeg
red_line.jpeg JPEG 400x400 400x400+0+0 8-bit sRGB 5.26KB 0.000u 0:00.000
identify -verbose red_line.jpeg
Type: TrueColor
Colorspace: sRGB
Depth: 8-bit
Channel depth:
red: 8-bit
green: 8-bit
blue: 8-bit
所以我的问题是:我可以用枕头创建图像,这样,无论我使用什么颜色,它们总是以相同的type: TrueColor
与3个通道?所以即使我在白色背景上画一条黑线。在
(注意:当我画一条默认宽度为1的红线时,它将有Type: Palette
而不是{
convert black_line.jpeg -type truecolor black_line_tc.jpeg
identify -verbose black_line_tc.jpeg |grep Type
Type: Grayscale
不会转换为TrueColor类型。 我对identify输出进行了区分,但是在channel_depth/colorspace/type等方面没有相关的区别,所以我不会发布输出。在
identify -verbose black_line.jpeg > identity_black.txt
identify -verbose black_line_tc.jpeg > identity_black_tc.txt
diff identity_black.txt identity_black_tc.txt
下面是一个使用ImageMagick将单通道灰度JPG图像强制为3通道颜色空间sRGB图像的示例。在
这里我创建了一个灰度渐变。然后使用Imagemagick identify-verbose,它显示为颜色空间的灰色。Exiftool确认为8位的1通道(颜色分量)。在
^{pr2}$现在我使用-typetruecolor将灰度图像转换为颜色空间RGB。ImageMagick表示颜色空间RGB,exiftool显示它是3个通道(颜色分量),每个通道8位。在
我怀疑PIL通过读取或创建图像时使用的通道数来定义颜色空间。对不起,我对皮尔不太熟悉。但如果没有,那么你可以把它传给numpy,让它变成3个频道。然后把它带回皮尔。在
对我有用。在以下测试中:
BW-RGB.jpg
是从Gimp导出的灰度等离子体图像(带有RGB通道)BW-Grey.jpg
是从Gimp导出的纯灰度(一个通道)中的同一个图像IM的
identify
说:如果我使用:
^{pr2}$IM的
identify
说:所以结果确实是RGB。请注意,RGB和灰度文件的大小没有太大区别,这是预期的。彩色图像保存为三帧,黑白一帧和两帧色度图像,但对于灰度图像(R=G=B),这两幅色度图像只有一个统一的值,因此压缩效果非常好。在
PS:在Linux上,您可以使用
file
命令确认IM的identify
报告:它报告一个灰度图像帧,三个彩色图像帧。在更新答案
我一直在尝试这个,它似乎很难控制-至少对我来说!在
我试着在你的图像中添加一些随机的红、绿、蓝像素,但这似乎不会导致字体很快变为真彩色。在
然后,我试着对所有像素加上或减去少量随机噪声,并取得了一些进展,但图像在ImageMagick确认它是真彩色之前就变得“明显不愉快”。在JPEG编码器中抑制子采样和提高质量有一点帮助,但没有多大帮助。在
我发现我必须将
N
(噪声量)增加到9,然后ImageMagick才同意图像是真彩色的。您可能需要进行实验,因此代码如下:原始答案
我不确定我能理解。以下是我制作RGB图像时得到的结果:
^{pr2}$现在我看看那些带有ImageMagick的图片,得到了我所期望的:
你希望什么?请单击原始问题下的
edit
,并给出一个反例。在相关问题 更多 >
编程相关推荐