Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Icon pixelfrei (https://www.delphipraxis.net/107796-icon-pixelfrei.html)

turboPASCAL 2. Feb 2008 14:48

Re: Icon pixelfrei
 
1. Das Windows-Bitmap Format was u.A. Delphi verwendet ist Äusserst bescheiden wenn es um die
Verwendung von Transparenzen geht.

2. Warum bleibst du nicht einfach bei Icons, zum Zeichnen dieser aber nur DrawIconEx() der Windows-API nutzen sonst wirds es wieder nix richtiges.

3. Willst du doch Bitmaps dan nutze die GR32 - Bitmaps die den Alphakanak unterstützen

4. Was du willst gnau machen mit die Icons ?

Lossy eX 2. Feb 2008 16:26

Re: Icon pixelfrei
 
Kommt drauf an was man vor hat. Wenn man das Icon selber zeichnen kann, dann ist sicherlich DrawIconEx die beste Wahl. Allerdings wenn das ein Icon in einer Komponente sein soll, dann kommt man um Bitmaps teilweise nicht herum, da diese leider nur mit Bitmaps arbeiten. So war es zu mindest bei mir immer.

Ich hatte gerade noch mal in Quellen von mir geschaut. Dort mache ich komischer weise nichts anderes als das Icon auf ein weißes Bitmap zu zeichnen. Und dabei wurde die Transparenz automatisch mit reingerechnet. Das was du im ersten Code gemacht hattest. Nur eben direkt weißer Hintergrund und Pixelformat war pf24Bit. Allerdings dort hatte es funktioniert. Was ich etwas komisch finde.

Bei dem zweiten Code müsstest du den Alphakanal direkt mit verrechnen. Denn Windows Bitmap können eigentlich kein Alphakanal. Verrechnen kannst du das in dem du für jedes Pixel die resultierende Farbe berechnest. Der Wert aus der Maske spiegelt dann die Sichtbarkeit wieder. Entweder die Hintergrundfarbe oder die des Pixels aus dem Icon. Natürlich musst du jeden Kanal seperat berechnen.

Nils_13 2. Feb 2008 17:19

Re: Icon pixelfrei
 
Hm, DrawIconEx dürfte wohl richtig sein.
Mit folgendem Code wird allerdings kein Icon mehr gezeichnet, seht ihr den Grund ?
Delphi-Quellcode:
function GetIcon(filename : String; IconIndex: Integer) : TBitmap;
begin
  Result := TBitmap.Create;
  DrawIconEx(Result.Handle, 0, 0, ExtractIcon(hInstance, PChar(Filename), IconIndex), 0, 0, 0, 0, DI_NORMAL);
end;

turboPASCAL 2. Feb 2008 18:18

Re: Icon pixelfrei
 
:wiejetzt:

Ja.

Zitat:

BOOL DrawIconEx(

HDC hdc, // handle to device context <---<<<
int xLeft, // x-coordinate of upper left corner
int yTop, // y-coordinate of upper left corner
HICON hIcon, // handle to icon to draw
int cxWidth, // width of the icon
int cyWidth, // height of the icon
UINT istepIfAniCur, // index of frame in animated cursor
HBRUSH hbrFlickerFreeDraw, // handle to background brush
UINT diFlags // icon-drawing flags
);
Code:
    DrawIconEx([color=#ff0000]Result.Canvas.Handle[/color], 0, 0, ..., 0, 0, 0, DI_NORMAL);
Sicher ist dein Code aber nicht und ob das so hinnhaut ?!

Nils_13 2. Feb 2008 18:21

Re: Icon pixelfrei
 
Habe dabei wohl gepennt. Ändert aber nichts an der Ausgabe. Meinst du mit unsicher, dass ich nicht prüfe, ob die Funktion fehlschlägt ?

Lossy eX 2. Feb 2008 19:06

Re: Icon pixelfrei
 
Hmmm. So kann das nicht gehen. Denn dein Bitmap hat gar keine Größe. Außerdem so wird das Icon gar nicht wieder freigegeben, da du das Handle ein Mal an eine Funktion übergibst und sofort vergisst.

Du solltest also wohl das Handle des Icons einem TIcon zuweisen. Mit der Größe dieses das Bitmap initialisieren. Und dann mit DrawIconEx das Icon auf das Bitmap zeichnen.

PS: Bitmap als Rückgabewert halte ich persönlich auch für nicht unproblematisch. Da eine andere Stelle das Bitmap freigeben muss als die bei der es erzeugt wurde. Also ich würde es erzeigen und per const an die Methode übergeben.

Nils_13 2. Feb 2008 20:22

Re: Icon pixelfrei
 
Ich habe es gerade zusammengebaut, es wird nun wieder gezeichnet aber genauso pixelig wie vorher:
Delphi-Quellcode:
procedure GetIcon(filename : String; IconIndex: Integer; var Result : TBitmap);
var Ico : TIcon;
begin
  Ico := TIcon.Create;
  Ico.Handle := ExtractIcon(hInstance, PChar(Filename), IconIndex);
  Result := TBitmap.Create;
  with Result do
  begin
    Width := Ico.Width;
    Height := Ico.Height;
    DrawIconEx(Canvas.Handle, 0, 0, Ico.Handle, 0, 0, 0, 0, DI_NORMAL);
  end;
  Ico.Free;
end;

Lossy eX 2. Feb 2008 23:47

Re: Icon pixelfrei
 
Benutzt du rein zufällig etwas anderes als Windows XP? Also zum Beispiel Windows 2000. Denn Windows 2000 kann noch keine Transparenzen.

Evtl schau dir auch mal an was du für Bitmaps bekommst. Also die mit GetIconInfo. Einfach mal auf Platte schreiben oder in Images darstellen. Vielleicht sind die Bilder ja schon falsch.

Denn sonst sieht der Code für mich zu mindest nicht falsch aus.

MuTzE 3. Feb 2008 09:54

Re: Icon pixelfrei
 
Wenn ich das richtig verstanden habe, gibts Probleme mit dem Alpha Channel.
Probier mal das hier: Advanced Icon

Klappt super.


MfG

MuTzE

Nils_13 3. Feb 2008 12:45

Re: Icon pixelfrei
 
Hi,

das Ergebnis sieht gut aus, aber ich verstehe nicht, was ich mit dem Ergebnis Icon.Images.Image anfangen soll. Das ist nämlich TIconImage und lässt sich nicht via Canvas zeichnen.

Habe mich nochmal genauer damit beschäftigt:
Delphi-Quellcode:
procedure GetIcon(filename : String; IconIndex: Integer; var Result : TBitmap);
var NumberOfIcons : Integer;
    Ico          : TIcon;
    Icon   : TAdvancedIcon;
    IconLib : TIconLibrary;
    Image  : TIconImage;
begin
  NumberOfIcons := ExtractIcon(hInstance, PChar(Filename), UINT(-1));

  Ico := TIcon.Create;
  if (Ico <> nil) and (NumberOfIcons > -1) then
    Ico.Handle := ExtractIcon(hInstance, PChar(Filename), IconIndex);

  Icon   := TAdvancedIcon(Ico);
  IconLib := TIconLibrary.Create;
  Image  := Icon.Images.Image[1];

  Result := TBitmap.Create;
  Image.Draw(Result.Canvas, 0, 0);
  Ico.Free;

  Icon.Free;
  IconLib.Free;
end;
Nun gibt es eine AV in der markierten Zeile der AdvancedIcon.pas:
Delphi-Quellcode:
function TIconImageList.GetIconImage(Index : Word) : TIconImage;
begin
  Result:=nil;
  IF Index>FCapacity Then exit; <--
  Result:=FList^[Index];
end;
Ich gehe davon aus, dass oben TAdvancedIcon(Ico) falsch ist, was müsste anstelle davon hin ? So habe ich es zumindest im Beispielcode gesehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 Uhr.
Seite 2 von 3     12 3      

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