Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Icon in Image sw wenn Maus drüber Farbe (https://www.delphipraxis.net/98298-icon-image-sw-wenn-maus-drueber-farbe.html)

Christian18 24. Aug 2007 15:17


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

shmia 24. Aug 2007 15:55

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.
http://www.delphipraxis.net/internal...ct.php?t=49179

Neutral General 24. Aug 2007 15:58

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.

Christian18 25. Aug 2007 08:41

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.

Christian18 25. Aug 2007 12:35

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

Christian18 26. Aug 2007 10:42

Re: Icon in Image sw wenn Maus drüber Farbe
 
Hallo,

hat niemand eine Idee wie ich das schneller machen kann?

MFG Christian18

kabuco 26. Aug 2007 10:48

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!

Garfield 26. Aug 2007 10:57

Re: Icon in Image sw wenn Maus drüber Farbe
 
Zitat:

Zitat von Christian18
hat niemand eine Idee wie ich das schneller machen kann?

Du benutzt einen Timer. Da kann man einen Interval einstellen.

Vielleicht hilft diese Seite weiter: http://www.efg2.com/Lab/Graphics/Colors/index.html

Jelly 26. Aug 2007 11:00

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.

Christian18 26. Aug 2007 11:49

Re: Icon in Image sw wenn Maus drüber Farbe
 
Zitat:

Zitat von Garfield
Zitat:

Zitat von Christian18
hat niemand eine Idee wie ich das schneller machen kann?

Du benutzt einen Timer. Da kann man einen Interval einstellen.

Vielleicht hilft diese Seite weiter: http://www.efg2.com/Lab/Graphics/Colors/index.html

Hallo,

ich habe das Intervall schon auf 1 gestellt!!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:07 Uhr.
Seite 1 von 2  1 2      

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