In ImageMagick, -skala 1x1! ignoriert die transparenten Pixel und gibt den Durchschnitt der undurchsichtigen Pixel an. Wenn Sie also den Durchschnitt der maskierten Region möchten, können Sie die Maske in den Alphakanal einfügen und dann -scale 1x1 verwenden! um es auf ein Pixel zu mitteln. Die Maske sollte weiß sein, wo Sie den Durchschnitt und Schwarz erhalten möchten, wo es transparent sein sollte, und diese Pixel im Durchschnitt ignorieren. Das sollte es also tun.
convert image.png mask.png -alpha off -compose copy_opacity -composite -scale 1x1! -alpha off -format "%[pixel:u.p{0,0}]" info:
Zum Beispiel, wenn ich machen das Logo: Bild transparent, wo es weiß ist, und dann den Durchschnitt, ich
convert logo: -transparent white -scale 1x1! -alpha off -format "%[pixel:u.p{0,0}]" info:
srgb(100,81,99)
Sie zeigen können, bekommen, dass dies funktioniert, indem man es tut der lange Weg. Multiplizieren Sie die Maske mit dem Bild und ermitteln Sie den Durchschnittswert für jeden Kanal des Produkts. Dann erhalte den Durchschnitt der Maske. Dann die Verhältnisse auf den Bereich von 0 bis 255.
convert logo: -transparent white logot.png
convert logot.png -alpha extract mask.png
declare `convert \(logot.png -alpha off \) mask.png -compose multiply -composite -format "IR=%[fx:mean.r]\nIG=%[fx:mean.g]\nIB=%[fx:mean.b]\n" info:`
echo "IR=$IR; IG=$IG; IB=$IB"
IR=0.0651798; IG=0.0529989; IB=0.0641607
MM=`convert mask.png -format "%[fx:mean]\n" info:`
echo "MM=$MM"
MM=0.165872
convert xc: -format "srgb(%[fx:round(255*$IR/$MM)],%[fx:round(255*$IG/$MM)],%[fx:round(255*$IB/$MM)])\n" info:
srgb(100,81,99)
Ergebnis skaliert berechnen ist das gleiche wie oben.Beachten Sie, dass
convert \(logot.png -alpha off \) mask.png -compose multiply -composite ...
in diesem Fall ist das gleiche wie nur
convert logot.png -alpha remove ...
Aber ich zeige ihm den langen Weg, wenn der Benutzer eine separate Maske hat und Bild ohne Transparenz:
ASIDE .
danke, das hat funktioniert! –