2016-11-18 3 views
0

Also bin ich kein Experte in Codierung: Ich habe nur ein vages Verständnis von ein paar Bits und Bobs.Opazität von RGB-Array

Ich verstehe, dass Bilder von Pixeldimensionen X * Y in einem Array der Größe 3 * X * Y gespeichert werden, wobei jeder von einem gegebenen (x, y) -Wert gezogene Vektor 3 Elemente für die 3 RGB-Werte aufweist.

Ich verstehe auch, dass man auch ein Bild in einem 4 * X * Y-Array speichern kann, wo jeder gezogene Vektor nun 4 Werte hat, RGBA mit A ist Alpha, um die Deckkraft eines bestimmten Pixels darzustellen.

Jetzt bin ich in Animation und habe Bleistiftzeichnungen von weißen Wolken auf einem schwarzen Hintergrund, die ich in Flash importieren möchte. Ich möchte, dass die schwärzeren Teile der Zeichnung transparenter und die helleren Teile undurchsichtiger sind. Ich habe die Scans der Zeichnungen im .png-Format gespeichert.

Wenn ich eine Idee hätte, wie man ein Bild auf der "Array-Ebene" manipulieren könnte, könnte ich selbst einen Stich bekommen, aber ich bin ratlos.

ich ein Programm benötigen, das eine .png Bild und ein Referenz-RGB-Wert {ABC} gegeben, erhält die RGB-Array des Bildes und wandelt es in ein Array RBGA so dass:

einem pixel des RGB-Wert {} pqr

...... Wird ......

ein pixel von RGBA-Wert {pqr 1-M [(| PA |^2 + | qb |^2 + | rc |^2)^1/2}}.

wobei M ein Normierungsfaktor ist, der den größten Wert macht alpha = 1.

dh M = 1/[(255 + 255^2^2 + 255^2)^1/2]) = 0,0026411 ...

dh der Alpha-Wert des Ersatzpixels ist der 'Abstand' zwischen der Farbe des Pixels und einer Referenzfarbe, die eingegeben werden kann.

Dies muss dann das neue RGBA-Array als PNG-Bild exportieren.

Irgendwelche Ideen oder irgendwelche anderen Animatoren wissen, ob dies direkt mit Actionscript getan werden kann?


Beispiel: Referenz = {250 251 245}

RGB array =

| {250 251 245} {250 250 250} |

| {30 255 22} {234 250 0} |

...... Wird ......

RGBA array =

| {250 251 245} 1 {250 251 245} 0,987 |

| {30 255 22 0,173} {234 250 0 0.352} |

+0

Sie scheinen die Mathematik beteiligt zu haben, was ist der Hangup? Dies ist kein Code-Schreibdienst. –

+0

Nein, ich weiß, ich habe nur keine Ahnung, wie ich es umsetzen soll. Ich habe nur die Grundlagen des Codierens in Matlab gemacht, also bin ich völlig am Ende. –

+0

Klingt interessant ... wie wäre es mit einigen Beispielbildern zum Spielen? –

Antwort

0

Sie können dies ganz einfach über die Befehlszeile ausführen, mit ImageMagick, das auf den meisten Linux-Distributionen installiert ist und unter OSX und Windows kostenlos zur Verfügung steht.

Die "geheime Soße" ist der -fx Operator - here beschrieben.

So lassen Sie sich ein 300x200 schwarzes Bild erzeugen und dann -fx verwenden den roten Kanal zu berechnen, so dass die roten über das Bild hinweg variiert je nachdem, was Bruchteil der Breite (w) man von der linken Seite ist (i):

convert -size 300x200 xc:black -channel R -fx 'i/w' result.png 

enter image description here

Bitte beachte, dass ich ein Bild bin Erzeugung "on-the-fly" mit -size 300x200 xc:black, während, wenn Sie eine PNG-Datei mit Ihrem Animationsrahmen in ihm haben, können Sie das in setzen, in seinem p Spitze.

Lassen Sie uns jetzt sagen, dass wir die Opazität/alpha variieren wollen - entsprechend dem Abstand nach unten das Bild von oben:

convert -size 300x200 xc:black -alpha on \ 
    -channel R -fx 'i/w'     \ 
    -channel A -fx 'j/h' result.png 

enter image description here

Ok, wir werden es bekommen ... Ihre Funktion ist ein wenig komplizierter, so, anstatt sie auf der Befehlszeile jedes Mal eingeben, können wir es in einer Skriptdatei setzen genannt RGB2Opacity.fx wie folgt aus:

convert -size 300x200 xc:black -alpha on -channel A -fx @RGB2Opacity.fx result.png 

wo RGB2Opacity.fx einfach und sieht wie folgt für den Moment:

0.2 

Jetzt müssen wir Ihre „Referenz“ Pixel auf der Kommandozeile mit dem Animationsrahmen gelegt, so dass ImageMagick den Unterschied arbeiten können . Das heißt, Ihre tatsächliche Befehlszeile mehr aussehen oder weniger genau wie die folgenden:

convert -size 300x200 xc:"rgb(250,251,245)" YourImage.png -alpha on -channel A -fx @RGB2Opacity.fx result.png 

Und dann brauchen wir Ihre Formel in der -fx Skriptdatei zu implementieren. Ihre Variablennamen müssen mindestens 2 Buchstaben lang sein und dürfen keine Ziffern enthalten, und Sie sollten einen einzelnen Wert für die Deckkraft zurückgeben. Variablen sind alle zwischen [0,1.0] skaliert, so dass Ihre 255 Skalierung ein wenig anders ist. Ich habe kein Bild Probe, und ich bin nicht sicher, wie die Antwort aussehen soll, aber es wird auf diesen ziemlich nahe sein:

MM=1/pow(3,0.5); 
pmasq=pow((u.r-v.r),2.0); 
qmbsq=pow((u.g-v.g),2.0); 
rmcsq=pow((u.b-v.b),2.0); 
1-MM*pow((pmasq+qmbsq+rmcsq),0.5) 

Ich weiß nicht, ob/wie Kommentare in -fx Skripte setzen, so ich werde die Variablennamen unten erklären:

  • pmasq ist das Quadrat von p minus a.

  • qmbsq ist das Quadrat von q minus b.

  • rmcsq ist das Quadrat von r minus c.

  • u.r bezieht sich auf den roten Kanal des ersten Bild in ImageMagick ‚s Liste, das heißt den roten Kanal des Referenzpixel.

  • v.g bezieht sich auf den grünen Kanal des zweiten Bild in ImageMagick ‚s Liste, das heißt den grünen Kanal des Animationsrahmen.

Lassen Sie uns jetzt Ihre Animationsrahmen erstellen:

convert xc:"rgb(250,251,245)" xc:"rgb(250,250,250)" xc:"rgb(30,255,22)" xc:"rgb(234,250,0)" +append frame.png 

enter image description here

Und überprüfen Sie sieht es richtig:

convert frame.png txt: 

Ausgabe

# ImageMagick pixel enumeration: 4,1,65535,srgb 
0,0: (64250,64507,62965) #FAFBF5 srgb(250,251,245) 
1,0: (64250,64250,64250) #FAFAFA grey98 
2,0: (7710,65535,5654) #1EFF16 srgb(30,255,22) 
3,0: (60138,64250,0) #EAFA00 srgb(234,250,0) 

Wenn wir das auf Ihr Bild anwenden und die Ergebnisse überprüfen, können Sie sehen, ich habe habe es irgendwo etwas falsch, butI'll lassen Sie (oder eine andere helle Funken), das trainieren ...

convert -size 4x1 xc:"rgb(250,251,245)" frame.png -alpha on -channel A -fx @RGB2Opacity.fx result.png 

convert result.png txt: 

# ImageMagick pixel enumeration: 4,1,65535,srgba 
0,0: (64250,64507,62965,65535) #FAFBF5FF srgba(250,251,245,1) 
1,0: (64250,64507,62965,64764) #FAFBF5FC srgba(250,251,245,0.988235) 
2,0: (64250,64507,62965,19018) #FAFBF54A srgba(250,251,245,0.290196) 
3,0: (64250,64507,62965,29041) #FAFBF571 srgba(250,251,245,0.443137)