Autor Beitrag
FlameDiver
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 104

WIN XP
D6 Pers
BeitragVerfasst: Do 11.11.04 20:34 
hi,

also ich möchte warbwerte umkerehn
also sprich wie bei paint das die farben denau das gegenteil sind

ich hab schon voll viel rumbrobiert und es will nicht klappen

also wenn ich die skala von 0 - 255 nehme rgb eben was muss ich dan rechnen um den gegenwert von zb 85 und 150 (also 2 werte :shock: ) zu bekommen??? ich bin echt am verzweifeln

danke im vorraus

_________________
From Hell and back again
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Do 11.11.04 20:39 
Ich weiß nicht, was haasträubender ist - deine Rechtschreibung oder deine inhaltliche Beschreibung des Problems. :?

Ich _vermute_ mal, dass du sowas meinst:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  c : TColor;
  r, g, b : Byte;
begin
  b:=c shr 16;
  g:=c shr 8;
  r:=c;
  c:=(255-b) shl 16 +(255-g) shl 8 +255-r;


Gruß,
Jörg

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
FlameDiver Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 104

WIN XP
D6 Pers
BeitragVerfasst: Do 11.11.04 20:46 
sorry wegen der rechtschreibung

aber ich hab das über integer werte gemacht

also
ausblenden Quelltext
1:
2:
var
r,g,b:integer;


und dann will ich über einfaches addieren und subtrahieren den gegenwert ausrechenen

dabei wir unterschieden ob der wert größer 128 oder kleiner 128 ist.

wenn der wert kleiner 128 muss ich ja die different von 128 und dem wert auf 128 drauf rechnen.

wenn der wert größer 128 is muss ich die differenz vom wert und 128 von 128 abziehen.

aber ich hab da glaub ich irgendwo nen denkfehler drin weil is delphi ned klapt...

_________________
From Hell and back again
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Do 11.11.04 20:49 
Zwei Dinge:
- Bei Integerwerten musst du "mod 256" rechnen, damit auch nur der relevante Farbkanal verwendet wird.
- Meine Routine macht genau das, was du dir vorstellst, nur einfacher. So musst du bei 128 nicht mehr unterscheiden.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
FlameDiver Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 104

WIN XP
D6 Pers
BeitragVerfasst: Do 11.11.04 20:58 
wenn man etwas leichter machen will muss man in diesem fall ich erstaml verstehen was das alles heißt: also:

ausblenden Delphi-Quelltext
1:
2:
3:
var
  c : TColor;
  r, g, b : Byte;

das is klar

aber was heißt bzw bewirkt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
begin
  b:=c shr 16;
  g:=c shr 8;
  r:=c;
  c:=(255-b) shl 16 +(255-g) shl 8 +255-r;


ich finde das mit integer werte sehr viel einfacher. ich benutz das einfach
ausblenden Delphi-Quelltext
1:
rgb(r,g,b);					

ich habe mich mit den byte dinger noch ned befast.

wie kann ich zb einen zahlewert an eine byte variable übergeben???

sorry wenn ich jetzt die bestimmt einfachsten sachen nicht versteh aber ich hab mich wie gesagt noch nicht damit befasst

Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.

_________________
From Hell and back again
JiimmyC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35

WinXP SP1

BeitragVerfasst: Do 11.11.04 21:09 
Nun, ich bin noch etwas neu bei delphi und noch weiss ich nicht ob dieses oder jenes akzeptiert wird doch dies muesste den wert einer Farbe auf exact dem gegenteil stellen:

ausblenden Quelltext
1:
farbe:= (NOT farbe) AND 00FFFFFFh					

NOT bewirkt dass die Farbe umgekehrt wird und das AND loescht nur das obere byte das die opazitaet festlegt (die natuerlich auch vom NOT umgekehrt wurde)
blackbirdXXX

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: Do 11.11.04 21:22 
Geht es nicht so auch?
ausblenden Delphi-Quelltext
1:
Color := Color xor $00FFFFFF;					


//Edit: Sorry. Nicht bis nach unten gelesen.
//Edit2: Code ausgetauscht. Jetzt isses der richtige

_________________
Klein, schwarz und ärgert Techniker? Jumper!


Zuletzt bearbeitet von blackbirdXXX am Do 11.11.04 21:28, insgesamt 2-mal bearbeitet
JiimmyC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35

WinXP SP1

BeitragVerfasst: Do 11.11.04 21:26 
blackbirdXXX hat folgendes geschrieben:
Geht es nicht so auch?
ausblenden Delphi-Quelltext
1:
rot := not rot and 255					


Wenn rot ein byte ist, dann kann man den wert auch so umdrehen. Ja. Doch den "and 255" kanns du dir dann sparen da das and 255 alle bits behalten wuerde und demnach nichts veraendern wuerde.

Cheers.
blackbirdXXX

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: Do 11.11.04 21:27 
@JiimmyC: Hab den falschen Code reinkopiert :oops:

_________________
Klein, schwarz und ärgert Techniker? Jumper!
JiimmyC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35

WinXP SP1

BeitragVerfasst: Do 11.11.04 21:42 
blackbirdXXX hat folgendes geschrieben:
Geht es nicht so auch?
ausblenden Delphi-Quelltext
1:
Color := Color xor $00FFFFFF;					


//Edit: Sorry. Nicht bis nach unten gelesen.
//Edit2: Code ausgetauscht. Jetzt isses der richtige


Jep - sehr besser :) Ich habe bloss irgeneine mentalle sperre mit dem xor.. es scheint mir immer - es dauere laenger fuer mich bis ich es mir vorstellen kann ;)
blackbirdXXX

ontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1077
Erhaltene Danke: 1

Ubuntu Dapper

BeitragVerfasst: Do 11.11.04 22:16 
ist 2 xor 2 nicht das gleiche wie not 2 and 2?

_________________
Klein, schwarz und ärgert Techniker? Jumper!
JiimmyC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35

WinXP SP1

BeitragVerfasst: Fr 12.11.04 03:29 
blackbirdXXX hat folgendes geschrieben:
ist 2 xor 2 nicht das gleiche wie not 2 and 2?


Nun, es gibt viele wege nach Rom und zur NULL.

Eine Zahl durch sich selbst gexorrt ist immer gleich Null.

Eine Zahl wenn ge-not-et das exakte binaere gegendteil von der Zahl ist die es vorher war. Wenn man nun das exacte gegendteil mit dem original and-et dann erhaehlt mann auch Null. :wink:
FlameDiver Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 104

WIN XP
D6 Pers
BeitragVerfasst: Fr 12.11.04 13:11 
is alles sehr schon aber wie oben schon geschreiben... ich versteh das nicht

_________________
From Hell and back again
JiimmyC
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 35

WinXP SP1

BeitragVerfasst: Fr 12.11.04 14:13 
Zitat:
is alles sehr schon aber wie oben schon geschreiben... ich versteh das nicht


Nun, etwas genauer insofern was du nicht verstehst? Ich denk mir mal es ist folgendes:

[quote="FlameDiver"]
aber was heißt bzw bewirkt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
begin
  b:=c shr 16;
  g:=c shr 8;
  r:=c;
  c:=(255-b) shl 16 +(255-g) shl 8 +255-r;

[/delphi]

Ok, Ich versuchs zu erklaeren. Ein integer ist genau genommen ein Dword und besteht aus 4 bytes und jedes byte hat 8 bits. Ein Dword sieht folgendermassen aus:

00 00 00 00

Joerg definierte r,g und b als bytes so dass diese jede fuer sich die momentane grundfarbe speichern.
Eine Farbe definiert sich folgendermassen:

ausblenden Quelltext
1:
2:
Opazitaet - blau - gruen - rot
   00     -  00  -  00   -  00


um nun blau aus der farbe herauszutrennen so shiftet er das dritte byte von links nach rechts ( b:=c shr 16;) so dass es im unterem byte landet und dann schreibt er dies in b.

ausblenden Quelltext
1:
2:
3:
Ein shr 16 shiftet 2 x 8 bits (2 bytes) nach rechts
davor:  00 12 CD 25
danach: 00 00 00 12


Und er verfaehrt genauso mit den anderen beiden bytes. ( g:=c shr 8; r:=c; )

Um nun das gegendteil der farbe zu bekommen so setzt er die farbe wieder zusammen (c:=(255-b) shl 16 +(255-g) shl 8 +255-r;) mit dem absoluten gegendteil jeder grundfarbe. Dazu substrahiert er von rot 255 da es bloss 255 moeglische farbkombinationen per byte ergeben (255 ist FF in hexadezimal) Beispiel: -128 -> +128 moegliche farbkombinationen. Nehme man 186 - 255 = -69 komplimentier farbe fuer 186. Danach shiftet er jede farbe wieder auf die Stelle auf die sie gehoert (fuer blau 2 bytes nach links - 16 bits - shl 16 und so weiter).

Blackbird hat nun xor vorgeschlagen - und wenn man ein integer mit -1 xor-ed so verhaelt es sich so dass das gesamte dword umgekehrt wird, also das gleich wie jede farbe einzeln zu nehmen und von ihr 255 abzuziehen.

Doch brauchen wir das gesamte dword nicht sondern bloss die drei grundfarben deshalb xor-ed er es auch bloss nur mit $00FFFFFF und laesst das obere byte bestehen.

Kurz: farbe = farbe xor $00FFFFFF ist das gleiche als wenn man jede grundfarbe auf die komplimentaer farbe umstellt sprich umkehren wuerde.