![]() |
Icon in Image sw wenn Maus drüber Farbe
Hallo,
ich habe eine Icon Datei. Diese lade ich in ein TImage. Ich möchte das Icon im Image nun Schaarz/Wiess angezeigt haben. Wenn ich mit der Maus darüber gehe, dann soll das Icon im Image Farbig werden. Aber langsam. Die Farbe soll nach und nach kommen. Wie kann ich sowas machen? LG Chris |
Re: Icon in Image sw wenn Maus drüber Farbe
Das wäre so eine Art Farb-Morphing notwendig.
Man muss jeden Punkt vom RGB Farbraum in den HSV Farbraum umrechnen, dann die Farbsättigung (Saturation) mit einem Faktor zwischen 0.0 und 1.0 multiplizieren und dann wieder zurück in den RGB Farbraum wandeln. ![]() |
Re: Icon in Image sw wenn Maus drüber Farbe
Eine vielleicht etwas unelegantere Methode wäre sich das Originalbild zu merken und das Bild in s/w anzeigen und im OnEnter oder so dann das Originalbild anzeigen und im OnExit wieder s/w machen. Wenn du wissen willst wie man ein Bild schwarz weiß bekommt ohne HSV dann sag bescheid. Eventuell speichert man das s/w Bild auch damit man das Bild nicht dauernd neu s/w machen muss.
EDIT: Ich seh grad das es kein OnEnter und OnExit beim TImage gibt aber ich denke mal das wird sich notfalls nachrüsten lassen. |
Re: Icon in Image sw wenn Maus drüber Farbe
Hallo,
ich habe das mal Probiert. Ich habe es seitens Software realisiert. Kann man die Hardware, z.b. die Grafikkarte noch miteinbinden? Weil das so ein bisschen lange dauert. Hier der Code:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) Image1: TImage; Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure Image1MouseEnter(Sender: TObject); function Mischen(Percent : Real) : TBitmap; procedure Timer1Timer(Sender: TObject); private Bitmap1 : TBitmap; Bitmap2 : TBitmap; Percent : Real; { Private-Deklarationen } public { Public-Deklarationen } end; type TFarbe = record Rot : Integer; Gruen : Integer; Blau : Integer; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var x, y : Integer; Farbe : TFarbe; Arith : Integer; begin Timer1.Enabled:=False; Percent:=0; Bitmap1:=TBitmap.Create(); Bitmap1.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Floppy.bmp'); Bitmap2:=TBitmap.Create(); Bitmap2.LoadFromFile(ExtractFilePath(Application.ExeName) + 'Floppy.bmp'); for x:=0 to Bitmap1.Width do begin for y:=0 to Bitmap1.Height do begin with Farbe do begin Rot:=GetRValue(Bitmap1.Canvas.Pixels[x, y]); Gruen:=GetGValue(Bitmap1.Canvas.Pixels[x, y]); Blau:=GetBValue(Bitmap1.Canvas.Pixels[x, y]); Arith:=Round((Rot + Gruen + Blau) / 3); end; Bitmap1.Canvas.Pixels[x, y]:=RGB(Arith, Arith, Arith); end; end; Image1.Picture.Bitmap:=Bitmap1; Form1.DoubleBuffered:=True; end; procedure TForm1.Image1MouseEnter(Sender: TObject); begin Timer1.Enabled:=True; end; function TForm1.Mischen(Percent: Real) : TBitmap; var x, y : Integer; Farbe1 : TFarbe; Farbe2 : TFarbe; Farbe3 : TFarbe; Temp : TBitmap; begin Temp:=TBitmap.Create(); Temp.Width:=Bitmap1.Width; Temp.Height:=Bitmap1.Height; for x:=0 to Bitmap1.Width do begin for y:=0 to Bitmap1.Height do begin with Farbe1 do begin Rot:=GetRValue(Bitmap1.Canvas.Pixels[x, y]); Gruen:=GetGValue(Bitmap1.Canvas.Pixels[x, y]); Blau:=GetBValue(Bitmap1.Canvas.Pixels[x, y]); end; with Farbe2 do begin Rot:=GetRValue(Bitmap2.Canvas.Pixels[x, y]); Gruen:=GetGValue(Bitmap2.Canvas.Pixels[x, y]); Blau:=GetBValue(Bitmap2.Canvas.Pixels[x, y]); end; with Farbe3 do begin Rot:=Round(Farbe1.Rot + (Farbe2.Rot - Farbe1.Rot) * Percent); Gruen:=Round(Farbe1.Gruen + (Farbe2.Gruen - Farbe1.Gruen) * Percent); Blau:=Round(Farbe1.Blau + (Farbe2.Blau - Farbe1.Blau) * Percent); end; Temp.Canvas.Pixels[x, y]:=RGB(Farbe3.Rot, Farbe3.Gruen, Farbe3.Blau); end; end; Result:=Temp; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if Percent = 1 then begin Timer1.Enabled:=False; end else begin Percent:=Percent + 0.2; Image1.Picture.Graphic:=Mischen(Percent); end; end; end. |
Re: Icon in Image sw wenn Maus drüber Farbe
Wenn ich mit der Maus über das Image gehe, dann soll das Bild Farbig werden. Das macht er ja auch schon. Aber wer soll das ein bisschen schneller machen. Was kann ich dagegen tun? Und es sollte keine Rolle spielen wie schnell die CPU arbeitet. Es soll dann auch allen PCs gleich schnell oder langsam eingeblendet werden.
MFG Chris |
Re: Icon in Image sw wenn Maus drüber Farbe
Hallo,
hat niemand eine Idee wie ich das schneller machen kann? MFG Christian18 |
Re: Icon in Image sw wenn Maus drüber Farbe
Hallo,
warum machst du es nicht so, dass du zwei Icons verwendest. Du lädst erst das s/w Bild und im onEnter-Event lädst du das Farbbild.Dürfte auf jedenfall schneller sein als ständig zu rechnen! Die ICO-Dateien dürften auch nicht so groß sein, dass das massig an Rechen- und Speicherleistung benötigen würde. Gruß kabuco Edit: H A L T ! STOP! hatte nicht gesehen, dass das Bild eingeblendet werden sollte! |
Re: Icon in Image sw wenn Maus drüber Farbe
Zitat:
Vielleicht hilft diese Seite weiter: ![]() |
Re: Icon in Image sw wenn Maus drüber Farbe
Kuck dir mal die Graphics32 Bibliothek an. Die Routinen dort drin sind recht performant implementiert.
|
Re: Icon in Image sw wenn Maus drüber Farbe
Zitat:
ich habe das Intervall schon auf 1 gestellt!!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz