Zerlegung von COLORREF in RGB - Nutzung der Funktion aus MFDL.js

Matop

Mitglied
Dabei seit
14.05.09
Beiträge
6
#1
Hallo,
ich möchte ein Script erstellen (JScript), welches Pixel oder Pixelbereiche eines Bildes scannt und letztendlich die RGB-Komponenten (aufgelöst nach R, G und B) analysiert bzw. für weitere Manipulationen / Berechnungen zugänglich macht. Sowohl als Integer als auch eventuell als String (nach dem Motto: FF_DrawText(text1, 10, 10, 22, 0, 400, false, false, schriftart, 0), wobei "text1" heissen könnte "Rotwert an Koordinate x,y ist 228" oder ähnlich.

Ausgehend von z.B. "farbe = FF_GetPixel(50,50);" muss ja COLORREF in die Komponenten (von 0 bis 255) zerlegt werden. In dem MasterFramer-Script (MFDL.js) habe ich die schöne Funktion "colors" gefunden, die ich unten nochmal anfüge und die ja eigentlich alles beinhaltet, was man braucht?!

Meine Frage nun als nicht so versierter Programmierer: Wie mache ich mir diese Funktion nützlich, wie ziehe ich die Information da raus, wie lautet die Syntax? Könnte mir da mal jemand einen kleinen Startschuss geben. Z.B.
"farbe = FF_GetPixel(50,50);" liefert mir COLORREF. Da ich mit "this.FromCR = function(co) usw." leider nicht so viel anfangen kann, wie lautet die exakte Syntax, um nun letzendlich "KomponenteRot=228" (Integer) zur Verfügung zu haben? Oder von "this.Format = function()..." nach dem "FF_GetPixel(x,y);" dann mal ein "var text1 = "Rotwert Pos. x/y ist 228";" zur Verfügung zu haben. Bitte nicht falsch verstehen, ich habe schon kleinere C-Programme geschrieben (nicht C++!), aber irgendwie bräucht ich mal ein Beispiel! Va "this.irgendwas" macht mir Probleme, ich kenne das nicht auf diese Art.

Freue mich auf Antwort!

Code:
function Colors()
	{
	this.r = this.g = this.b = 0;

	// Konvertierung von "RRR GGG BBB"
	this.Scan = function(color)
		{
		var c = color.split(" ");
		this.r = parseInt(c[0],10);
		this.g = parseInt(c[1],10);
		this.b = parseInt(c[2],10);
		}
	// Konvertierung von COLORREF
	this.FromCR = function(co)
		{
		this.b = (co >>> 16) & 255;
		this.g = (co >>> 8) & 255;
		this.r = co & 255;
		}
	// Konvertierung nach "RRR GGG BBB"
	this.Format = function()
		{
		var i,s = new Array(this.r.toString(),
							this.g.toString(),
							this.b.toString());
		for(i=0; i<3; i++)
			{
			if(s[i].length < 2) s[i] = "00" + s[i];
			else {if(s[i].length < 3) s[i] = "0" + s[i];}
			}
		return(s[0] + " " + s[1] + " " + s[2]);
		}
	// Konvertierung nach COLORFREF
	this.ToCR = function()
		{return (this.b << 16) + (this.g << 8) + this.r;}
	}
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.813
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#2

Matop

Mitglied
Dabei seit
14.05.09
Beiträge
6
#3
AW: Zerlegung von COLORREF in RGB - Nutzung der Funktion aus MFDL.js

Hallo Harald, danke! Ich werde mir die Doku mal durchsehen. Kann eine Weile dauern, läuft etwas nebenher, habe gerade viele Dinge um die Ohren.

Ich möchte niemanden davon abhalten, doch noch ein kleines Beispiel zu posten ;) . Manchmal reicht das schon, um die Kurve zu kriegen... :)

Matthias
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.813
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#4
AW: Zerlegung von COLORREF in RGB - Nutzung der Funktion aus MFDL.js

Hallo Matthias,
hier mal die gewünschte Zerlegung im VBS-Code:
Code:
farbe = FF_GetPixel(50,50)
Rot = farbe And &HFF&
Gruen = (farbe And &HFF00&)\256
Blau = (farbe And &HFF0000&)\65536
Die Rückberechnung erfolgt übrigens mit der Formel
Code:
farbe = Rot + Gruen * (2^8) + Blau * (2^16)
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.099
Standort
Anzing BY
#5
AW: Zerlegung von COLORREF in RGB - Nutzung der Funktion aus MFDL.js

Hallo Mathias,

steht eigentlich schon da in Deinem Beispiel. Musst nur die Objekt-Variablen durch eigene ersetzen:
Zerlegen von ColorRef
Code:
co = FF_GetPixel(x,y);
blau = (co >>> 16) & 255;
gruen = (co >>> 8) & 255;
rot = co & 255;
Was macht der Code? Er benützt den BitShift-Rechts-Operator um um 1 (8bit)bzw. 2 Bytes (16Bit) zu verschieben und maskiert auf 8-bit (&-(Und)-Operator mit 1 Byte Wert=11111111b = FFh = 255)aus. Fertig. Schneller geht's nicht. Hier ist VBScript eindeutig im Nachteil, da hier eine Division durchgeführt werden muss, was mehr Taktzyklen braucht!

Umgekehrt um wieder auf ColorRef zu kommen:
Code:
co = (blau << 16) + (gruen << 8) + rot;
Die Unterschiede der beiden Operatoren liegen nicht nur in der Richtung, sondern dass einer die verschobenen Bits, die aus dem Register geschoben werden, abschneidet, der andere schiebt sie auf der gegenüberliegenden Seite wieder rein. Genaueres aber bitte selbst nachlesen.
 
Zuletzt bearbeitet:

Matop

Mitglied
Dabei seit
14.05.09
Beiträge
6
#6
AW: Zerlegung von COLORREF in RGB - Nutzung der Funktion aus MFDL.js

Hey, danke sehr! Irgendwie hab ich wohl nicht um diese Ecke herumgedacht, oder man sieht den Wald vor lauter Bäumen nicht. Scheint also im Prinzip schon klar zu sein. Werde ich demnächst probieren. Scheinst ein VB Fan zu sein - durchaus verständlich, aber ich hab mich auf C "eingeschossen", auch wenn's etwas kryptischer ist im Code. Von daher ist mir das JScript eher "symphatisch".

Danke und Gruß
 

Matop

Mitglied
Dabei seit
14.05.09
Beiträge
6
#7
AW: Zerlegung von COLORREF in RGB - Nutzung der Funktion aus MFDL.js

Hallo Werner, danke sehr. Das ist mir sehr sympathisch, dass es im Prinzip schon da steht. Manchmal sieht man den Wald vor lauter Bäumen nicht. Dass dies ein sehr schneller und effizienter Code ist, ist denke ich von Vorteil, da viele Pixel ... ;-)

Gruß Matthias
 
Oben