検出アルファチャンネルImageMagick
-
24-09-2019 - |
質問
シナリオ
いの画像の保存とアルファードの透明 .png
画像無しアルファードの透明 .jpg
(けられているだけでなく元のファイルフォーマットでは .png
または .gif
).できるかを検出しの有無にかかわらず、画像のアルファ透明性をImageMagick?
解決
ImageMagikにコマンドます:
identify -format '%[channels]' foo.png
アルファチャンネルが存在するかどうは、それぞれ、rgba
又はrgb
を印刷します。
があり、実際に任意の透明性を持っているが、それはもう少し複雑ではないことでデータのないアルファチャンネルが存在することができます。
他のヒント
を確認することができますが、画像が実際に透明...コンテキストメニューなどからアルファチャンネルが未使用)
このコマンド:
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:
(...)
こちらはアルファチャンネルしかし、このものではありませんであることを立証する画像は透明。って見積書や請求書を発行するsaasで が ます。の出力のコマンドに関する情報アルファチャンネル:
(...)
Alpha:
min: 255 (1)
max: 255 (1)
mean: 255 (1)
standard deviation: 0 (0)
kurtosis: 0
skewness: 0
(...)
この例では、アルファのような写真は不透明: min
= max
=1(1=不透明であるものの、0=。その場合でも、画像のアルファチャネルにおいては、ユーザは不透明。
こともできます:
(...)
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
.を選択するこのルートは、注意のアルファチャンネル。の場合は8ビットの、その後-255の範囲で最大限の意味は"不透明".の場合は16ビット単位の最大値は65535 255手段と"ほとんど透明".より良いチェックの山括弧は常に範囲が0-1.
疑いがある場合は、多くの写真でございますので、ご留意のないアルファチャンネルで容易にできることを最初に実行します:
identify -format '%[channels]' some_pic.png
場の堆積場:
rgba
あるアルファチャネルの a
出力) convert
要チェックに使用され min
, など。だがないということである必要があり convert
.なかったのが、世の中には、ベンチマーキングこれら二つのコマンド identify
必要なコストはきわめて不確実であ convert
.
画像はアルファチャンネル
を持っているかどうかを確認を使用する、の-format %A
の serhiy.hの回答のよう。
画像がまったく透明または半透明のピクセルを持っていない場合は、%のA画像透明度チャネルが有効(真/偽の)
チェック
使用-format %[opaque]
のの。
<時間>%[不透明]計算値:?画像は完全に不透明
例
は実証するために、アルファチャンネルを有するが、完全に不透明である画像a.png
を作成することができ、一つの半透明ピクセルを除いて同じである画像b.png
$ convert rose: PNG32:a.png
$ convert rose: -fill '#0008' -draw "matte 10,10 point" PNG32:b.png
はASが予想される、%A
エスケープは、両方のアルファチャンネルを持っているので、両方の画像についてTrue
を生成します
$ identify -format '%A' a.png
True
$ identify -format '%A' b.png
True
%[opaque]
エスケープがある場合にtrue
を生成し、一方の透明画素に他の原因でfalse
一方
$ identify -format '%[opaque]' a.png
true
$ identify -format '%[opaque]' b.png
false
identify -format %A some_pic.png
画像にアルファチャンネルが含まれている場合は、はTrue
を返します。
あなたはアルファ透明度が実際に使用されていることを確認したい場合は、私はそれは透明だかどうかは確認するために、色情報をすべてのピクセルを反復して取得するために参照する唯一のソリューション。大きな画像については、これは非常に遅いので、最適化としてあなたが最初(のは20×20を言わせて)画像のサムネイルを作ることができることが、その後、サムネイルのピクセルをチェックします。これは私にとって良い解決策だった。
ここでのImageMagickを使用して、PNGは透明性を持っているかいないかどうかを確認するには、bashの機能のカップルは、です。
簡易チェック、存在のためだけにチェックアルファチャンネルの
checkAlphaFast() {
test $(identify -format %A "$1") == True
}
遅いチェック、検証画素自体(アルファチャンネルが存在する場合でも):
checkAlphaSlow() {
test $(identify -format '%[opaque]' "$1") == false
}
それはかなり速いいずれかの方法だからです。あなただけの、あなたが全体の多くにこれをやっている場合は、高速チェックを使用して検討すべきです。私はこれらの関数を作ったから答えた他の人のおかげで、:)
ボーナスとして:私はすべてのベンチマークをしなかったが、これは、ほぼ同じ速、高速モードなどと低速モードとして正確ようなものであってもよい。
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
}
丸みを帯びた割合としてそして、この1つの出力、整数はbashのためにそんなにより自然であるためます:
checkPercentage() {
printf %3.2f $(checkOpaqueness "$1") | tr -d . | sed -r 's/^0?0?//'
}