首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ImageMagick检测Alpha通道

问使用ImageMagick检测Alpha通道
EN

Stack Overflow用户
提问于 2010-04-06 06:05:33
回答 6查看 21.8K关注 0票数 32

场景

我想将具有alpha透明度的图像保存为.png,将没有alpha透明度的图像保存为.jpg (即使它们的原始格式是.png或.gif)。如何使用ImageMagick检测图像是否具有alpha透明度?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-04-06 06:17:47

ImageMagik命令:

代码语言:javascript
复制
identify -format '%[channels]' foo.png 

如果有或没有alpha通道,将分别打印rgba或rgb。

可能会有一个alpha通道,其中没有数据,实际上不会有任何透明度,但这有点复杂。

票数 34
EN

Stack Overflow用户

发布于 2016-01-02 17:54:04

检查图像是否有alpha通道

按照serhiy.h's answer使用-format %A,。从documentation

%启用图像透明度通道(true/false)

检查图像是否没有透明或半透明像素

使用-format %[opaque].从documentation

%不透明计算:图像是否完全不透明?

示例

为了演示,让我们创建一个具有alpha通道但完全不透明的图像a.png,以及一个除了一个半透明像素之外相同的图像b.png:

代码语言:javascript
复制
$ convert rose: PNG32:a.png
$ convert rose: -fill '#0008' -draw "matte 10,10 point" PNG32:b.png

不出所料,%A转义会为两个图像生成True,因为这两个图像都有alpha通道:

代码语言:javascript
复制
$ identify -format '%A' a.png
True
$ identify -format '%A' b.png  
True

而%[opaque]转义在一种情况下生成true,在另一种情况下生成false,这是由于一个透明像素:

代码语言:javascript
复制
$ identify -format '%[opaque]' a.png
true
$ identify -format '%[opaque]' b.png
false
票数 33
EN

Stack Overflow用户

发布于 2013-09-20 21:40:44

如果你想检查一张图片实际上是透明的...(不仅仅是可能未使用的alpha通道)

使用以下命令:

代码语言:javascript
复制
convert some_pic.png -verbose info:

(是的,在命令的末尾有一个: )

它相当冗长。查找channels列表:

代码语言:javascript
复制
(...)
Channel depth:
  red: 16-bit
  green: 16-bit
  blue: 16-bit
Channel statistics:
(...)

在本例中,有三个通道,每个通道对应一个基色。但不适用于alpha。所以这张图片是不透明的。

但是你也可以得到这样的输出:

代码语言:javascript
复制
(...)
Channel depth:
  red: 16-bit
  green: 16-bit
  blue: 16-bit
  alpha: 1-bit
Channel statistics:
(...)

这里有一个alpha通道。然而,这并不能证明图像是透明的。它只是说它可能是。在该命令的输出中,查找有关alpha通道的信息:

代码语言:javascript
复制
(...)
  Alpha:
    min: 255 (1)
    max: 255 (1)
    mean: 255 (1)
    standard deviation: 0 (0)
    kurtosis: 0
    skewness: 0
(...)

在本例中,alpha表示图片是不透明的:min = max =1 (1 =不透明,0=透明)。因此,即使图像具有alpha通道,用户也会看到不透明的图片。

您还可以获得以下内容:

代码语言:javascript
复制
(...)
  Alpha:
    min: 95 (0.372549)
    max: 212 (0.831373)
    mean: 111.187 (0.436028)
    standard deviation: 19.5635 (0.0767196)
    kurtosis: 7.52139
    skewness: -2.80445
(...)

这次,min = 0.372549。这意味着一些像素是部分透明的。mean也很低。似乎图像的很大一部分使用了透明度。

根据你想要实现的检查类型(完全不透明,“几乎不透明”等),如果你的请求有点棘手,你应该检查min,mean,也许还有standard deviation。

注意:您可能会尝试检查min、mean和其他变量的整数值,就像我在第一个地方所做的那样。毕竟,处理95比处理0.372549更容易。如果选择此路线,请注意alpha通道深度。如果是8位,则255是最大值,表示“不透明”。如果它是16位,那么最大值现在是65535,255表示“几乎透明”。最好检查括号中的浮点数,它的范围总是从0到1。

如果你怀疑你要处理的许多图片根本没有alpha通道,那么首先运行可能会很有用:

代码语言:javascript
复制
identify -format '%[channels]' some_pic.png

如果它转储:

代码语言:javascript
复制
rgba

有一个alpha通道(输出中的a ),convert应该用来检查min等。但是如果没有,就不需要运行convert。尽管我没有对这两个命令进行基准测试,但identify应该比convert快得多。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2581469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档