AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Aus Intensität neue Farbe berechnen
Thema durchsuchen
Ansicht
Themen-Optionen

Aus Intensität neue Farbe berechnen

Ein Thema von glkgereon · begonnen am 14. Okt 2005 · letzter Beitrag vom 14. Okt 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#1

Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 11:57
Hi

ich habe ein TBitmap, einen 2D Array of Byte und eine Hintergrundfarbe.

ich möchte nun das auf jedes Pixel eines neues TBitmap die Farbe des alten Bitmaps mit der Intensität des jeweiligen Bytes gegenüber der Hintergrundfarbe errechnet wird.
ich hoffe das war soweit verständlich

also ein paar beispiele:

HGFarbe = Rot
AltPixel = Blau

Byte = 255
=> NeuPixel = Blau
Byte = 0
=> NeuPixel = Rot
Byte = 128
=> NeuPixel = Lila

gibt es sowas?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 12:50
Hallo Gereon,

du suchst einen Color Fading Algorithmus? Da gibt es verschiedene. Da ich gerade keinen Zugriff auf meine Fachbibliothek habe, hier nur die Idee: Du musst für jedes Pixel im Bild die RGB-Differenz bestimmen, indem du DeltaRed aus PixelRed - BackgroundRed bildest - DeltaBlue und DeltaGreen analog. Die Intensität der Farbe im neuen Pixel errechnet sich dann aus dem Shift-Wert aus deinem ByteArray und dem Delta, indem du NewRed aus BackgroundRed + DeltaRed * Shift / 255 berechnest, die anderen Farbwerte wieder analog. Ist nicht viel Code, aber Optimieren lohnt sich. Bestimmt findest du sogar etwas Fertiges mit den richtigen Suchbegriffen.

Grüße vom marabu

Mist - Vorzeichen war vertauscht...
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#3

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 13:13
ja, mit etwas überlegen bin ich letztendlich auf folgendes Code gekommen (Die beiden ersten kommen aus der Codelib):

Delphi-Quellcode:
function RGB2TColor(const R, G, B: Byte): Integer;
begin
  // convert hexa-decimal values to RGB
  Result := R + G shl 8 + B shl 16;
end;


procedure TColor2RGB(const Color: TColor; var R, G, B: Byte);
begin
  // convert hexa-decimal values to RGB
  R := Color and $FF;
  G := (Color shr 8) and $FF;
  B := (Color shr 16) and $FF;
end;

function FadeColor(Cl, BGCl: TColor; Fade: Byte):TColor;
var CR, CG, CB, HR, HG, HB: Byte;
begin
  TColor2RGB(CL,CR,CG,CB);
  TColor2RGB(BGCl,HR,HG,HB);
  CR:=(CR*Fade+HR*(256-Fade)) div 256;
  CG:=(CG*Fade+HG*(256-Fade)) div 256;
  CB:=(CB*Fade+HB*(256-Fade)) div 256;
  Result:=RGB2TColor(CR,CG,CB);
end;
ich weiss nicht ob er funktioniert, da er für meine Anwendung offensichtlich deutlich zu langsam ist und es nur flackert, ohne das man was erkennen kann.
ich werde heute abend nochmal genau testen...
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#4

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 13:22
div 256? Mach das zu shr 8 und es sollte deutlich schneller werden
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#5

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 13:28
Ich wollt blos mal mekern:

Zitat:
CR:=(CR*Fade+HR*(256-Fade)) div 256;
muss eigendlich:

CR:=(CR*Fade+HR*(255-Fade)) div 255;

lauten, da Fade einen Umfang von 0..255 hat !


mfg

DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
ripper8472

Registriert seit: 17. Aug 2003
275 Beiträge
 
#6

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 13:29
das optimiert der compiler schon weg. wichtiger waere ein OR statt + in der oberen funktion.

leute, benutzt mehr bitoperationen!!
Christoph
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 14:32
Und natürlich kein Pixels benutzen .
Oder ganz schnell :
Delphi-Quellcode:
// GR32-Lib, [url]www.graphics32.org[/url]
// Unit GR32_Blend
// "Note, that after using the Blend function, you have to call EMMS. Otherwise CPU will be unable to handle floating point instructions."

function M_BlendReg(F, B: TColor32): TColor32;
asm
  // blend foregrownd color (F) to a background color (B),
  // using alpha channel value of F
  // EAX <- F
  // EDX <- B
  // Result := Fa * (Frgb - Brgb) + Brgb
        db $0F,$6E,$C0 /// MOVD MM0,EAX
        db $0F,$EF,$DB /// PXOR MM3,MM3
        db $0F,$6E,$D2 /// MOVD MM2,EDX
        db $0F,$60,$C3 /// PUNPCKLBW MM0,MM3
        MOV ECX,bias_ptr
        db $0F,$60,$D3 /// PUNPCKLBW MM2,MM3
        db $0F,$6F,$C8 /// MOVQ MM1,MM0
        db $0F,$69,$C9 /// PUNPCKHWD MM1,MM1
        db $0F,$F9,$C2 /// PSUBW MM0,MM2
        db $0F,$6A,$C9 /// PUNPCKHDQ MM1,MM1
        db $0F,$71,$F2,$08 /// PSLLW MM2,8
        db $0F,$D5,$C1 /// PMULLW MM0,MM1
        db $0F,$FD,$11 /// PADDW MM2,[ECX]
        db $0F,$FD,$D0 /// PADDW MM2,MM0
        db $0F,$71,$D2,$08 /// PSRLW MM2,8
        db $0F,$67,$D3 /// PACKUSWB MM2,MM3
        db $0F,$7E,$D0 /// MOVD EAX,MM2
end;
Vielleicht kann das ja jemand auf "Intensität" statt Alphakanal von F umschreiben. Ich habe jedenfalls keine Ahnung von Assembler, von MMX noch weniger.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.058 Beiträge
 
Delphi 12 Athens
 
#8

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 14:48
Zitat von DerDan:
Ich wollt blos mal mekern:

Zitat:
CR:=(CR*Fade+HR*(256-Fade)) div 256;
muss eigendlich:

CR:=(CR*Fade+HR*(255-Fade)) div 255;

lauten, da Fade einen Umfang von 0..255 hat !


mfg

DerDan

Fast richtig

div 256 muß bleiben, da 0 bis 255 = 256.


Code:
CR := (CR * Fade + HR * (25[color=red]5[/color]-Fade)) div 25[color=red]6[/color];
und falls es unbedingt wer will, obwohl es die Codeoptimierung ja auch so ändert ^^
Code:
CR := (CR * Fade + HR * (25[color=red]5[/color]-Fade)) [color=red]shr 8[/color];
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 17:20
Hallo Leute,

der von mir formulierte Algorithmus in der Formelsprache von Gereon lautet:

CR := HR + (CR - HR) * FADE / 255; Sei CR = 200 und HR = 20. Bei meinem ersten Testfall ist FADE = 255 und ich erwarte, dass CR sich dann nicht ändert. Bei einem FADE von 0 erwarte ich, dass CR zu HR wird. Und bei einem FADE von 102 erwarte ich eine 40-prozentige Intensität für CR vor HR - rechnerisch 92. Bekommt ihr das mit euren Berechnungen hin?

Nachdenkliche Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#10

Re: Aus Intensität neue Farbe berechnen

  Alt 14. Okt 2005, 20:37
also

CR = 100
HR = 10

CR = HR + (CR - HR) * FADE / 255

Fade = 0
CR = 10 + (100-10)*0/255 = 10 //Korrekt

Fade = 255
CR = 10 + (100-10)*255/255 = 10+ (100-10) = 100 //Korrekt


CR = (CR*Fade + HR*(255-Fade)) / 255;

Fade = 0
CR = (100*0 + 10*(255-0)) / 255 = 10*255/255 = 10 //Korrekt

Fade = 255
CR = (100*255 + 10*(255-255))/255 = 100*255/255 = 100 //Korrekt

beide korrekt?
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz