使用ImageMagick检测Alpha通道 脚本

使用ImageMagick检测Alpha通道 脚本,image,png,imagemagick,jpeg,alpha,Image,Png,Imagemagick,Jpeg,Alpha,我想将具有alpha透明度的图像保存为.png,而不具有alpha透明度的图像保存为.jpg(即使其原始格式为.png或.gif)。如何使用ImageMagick检测图像是否具有alpha透明度?ImageMagik命令: identify -format '%[channels]' foo.png 如果有或没有alpha通道,将分别打印rgba或rgb 可能存在一个alpha通道,其中没有任何数据,实际上没有任何透明度,但这有点复杂。如果您想确保真正使用alpha透明度,我看到的唯一解决方

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

ImageMagik命令:

identify -format '%[channels]' foo.png 
如果有或没有alpha通道,将分别打印
rgba
rgb


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

如果您想确保真正使用alpha透明度,我看到的唯一解决方案是迭代所有像素并获取颜色信息以检查其是否透明。对于大型图像,这将非常缓慢,因此,作为一种优化,您可以首先制作图像的缩略图(比如20x20),然后检查缩略图像素。这对我来说是一个很好的解决方案。

如果您想检查图片是否确实是透明的。。。(不仅仅是可能未使用的alpha通道)

使用此命令:

convert some_pic.png -verbose info:
(是的,命令末尾有一个

它相当冗长。查找频道列表:

(...)
Channel depth:
  red: 16-bit
  green: 16-bit
  blue: 16-bit
Channel statistics:
(...)
在本例中,有三个通道,每种原色一个通道。但对阿尔法来说不是。所以这个图像不是透明的

但你也可以得到这种输出:

(...)
Channel depth:
  red: 16-bit
  green: 16-bit
  blue: 16-bit
  alpha: 1-bit
Channel statistics:
(...)
这里有一个阿尔法通道。然而,这并不能证明图像是透明的。它只是说它可能是。在命令的输出中,查找有关alpha通道的信息:

(...)
  Alpha:
    min: 255 (1)
    max: 255 (1)
    mean: 255 (1)
    standard deviation: 0 (0)
    kurtosis: 0
    skewness: 0
(...)
$ identify -format '%A' a.png
True
$ identify -format '%A' b.png  
True
checkAlphaFast() {
    test $(identify -format %A "$1") == True
}
在本例中,alpha表示图片不透明:
min
=
max
=1(1=不透明,0=透明)。因此,即使图像具有alpha通道,用户也会看到不透明的图片

您还可以获得以下信息:

(...)
  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。这意味着某些像素部分透明<代码>平均值也很低。看起来图像的很大一部分使用了透明度

根据您想要实现的检查类型(完全不透明、“几乎不透明”等),您应该检查
min
mean
,如果您的请求有点棘手,还可以检查
标准偏差

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

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

identify -format '%[channels]' some_pic.png
如果它转储:

rgba
有一个alpha通道(输出中的
a
),应使用
convert
检查
min
等。。但如果没有,则无需运行
convert
。虽然我没有对这两个命令进行基准测试,
identify
应该比
convert
快得多

identify -format %A some_pic.png
如果图像包含alpha通道,将返回
True

检查图像是否具有alpha通道 根据使用
-格式%A
。从:

%已启用图像透明度通道(真/假)

检查图像是否没有透明或半透明像素 使用
-格式%[不透明]
。从:

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


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

$ convert rose: PNG32:a.png
$ convert rose: -fill '#0008' -draw "matte 10,10 point" PNG32:b.png
$ identify -format '%[opaque]' a.png
true
$ identify -format '%[opaque]' b.png
false
正如所料,
%A
转义为两个图像生成
True
,因为它们都有一个alpha通道:

(...)
  Alpha:
    min: 255 (1)
    max: 255 (1)
    mean: 255 (1)
    standard deviation: 0 (0)
    kurtosis: 0
    skewness: 0
(...)
$ identify -format '%A' a.png
True
$ identify -format '%A' b.png  
True
checkAlphaFast() {
    test $(identify -format %A "$1") == True
}
%[不透明]
转义在一种情况下产生
true
,在另一种情况下由于一个透明像素而产生
false

$ convert rose: PNG32:a.png
$ convert rose: -fill '#0008' -draw "matte 10,10 point" PNG32:b.png
$ identify -format '%[opaque]' a.png
true
$ identify -format '%[opaque]' b.png
false

这里有几个bash函数,可以使用ImageMagick检查png是否具有透明度

快速检查,仅检查是否存在alpha通道:

(...)
  Alpha:
    min: 255 (1)
    max: 255 (1)
    mean: 255 (1)
    standard deviation: 0 (0)
    kurtosis: 0
    skewness: 0
(...)
$ identify -format '%A' a.png
True
$ identify -format '%A' b.png  
True
checkAlphaFast() {
    test $(identify -format %A "$1") == True
}
慢速检查,验证像素本身(即使存在alpha通道):

你应该只考虑使用快速检查,如果你做了这么多,因为它是非常快的任何方式。感谢其他回答我的人,我从他们身上实现了以下功能:)

作为奖励:我没有进行任何基准测试,但这可能与快速模式一样快,与慢速模式一样准确:

checkAlpha() {
    checkAlphaFast "$1" && checkAlphaSlow "$1"
}
使用以下功能:

if checkAlpha "$myPNG"; then
    # is transparent
else
    # is opaque
fi

这将给你图像的不透明性,其中0是完全透明的,1是完全不透明的:

checkOpaqueness() {
    if checkAlphaFast "$1"; then
        convert "$1" -verbose info: | grep -A3 Alpha: | tail +4 | head -n1 | sed -r 's/.*\(|\)//g'
    else
        echo 1
    fi
}
这一个以舍入百分比的形式输出,因为对于bash来说整数更自然:

checkPercentage() {
    printf %3.2f $(checkOpaqueness "$1") | tr -d . | sed -r 's/^0?0?//'
}

阿尔法通道中没有数据是常见的吗?如果是这样的话,我能找到答案吗?根据我的经验,人们只在希望alpha通道非空时才创建alpha通道,但通常发生的情况和可能发生的情况是不同的。除非你发现它突然出现,否则我不会担心的。我只是想完整地指出,阿尔法通道的存在并不一定意味着透明度的存在。啊,是的。永远不要低估用户。谢谢这确实是一个非常古老的问题,但缺少alpha通道并不意味着缺少alpha像素。有可能有一个索引RGB png,其中一些索引项是完全透明的。请参阅png文档中的TRN。谢谢!对于这样的输出,如果$(identifite-format“%[不透明]”“$file”);然后。。。;fi
我花了一整天寻找
%[opa