AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Icon pixelfrei

Ein Thema von Nils_13 · begonnen am 2. Feb 2008 · letzter Beitrag vom 24. Sep 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#11

Re: Icon pixelfrei

  Alt 2. Feb 2008, 14:48
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 ?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#12

Re: Icon pixelfrei

  Alt 2. Feb 2008, 16:26
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.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#13

Re: Icon pixelfrei

  Alt 2. Feb 2008, 17:19
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;
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#14

Re: Icon pixelfrei

  Alt 2. Feb 2008, 18:18


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 ?!
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#15

Re: Icon pixelfrei

  Alt 2. Feb 2008, 18:21
Habe dabei wohl gepennt. Ändert aber nichts an der Ausgabe. Meinst du mit unsicher, dass ich nicht prüfe, ob die Funktion fehlschlägt ?
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#16

Re: Icon pixelfrei

  Alt 2. Feb 2008, 19:06
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.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#17

Re: Icon pixelfrei

  Alt 2. Feb 2008, 20:22
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;
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#18

Re: Icon pixelfrei

  Alt 2. Feb 2008, 23:47
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.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE
MuTzE

Registriert seit: 24. Sep 2003
59 Beiträge
 
#19

Re: Icon pixelfrei

  Alt 3. Feb 2008, 09:54
Wenn ich das richtig verstanden habe, gibts Probleme mit dem Alpha Channel.
Probier mal das hier: Advanced Icon

Klappt super.


MfG

MuTzE
A8N32-SLI Deluxe | AMD 64 X2 3800+ @ 2700 MHz | Corsair TWINX1024-3200XL @ 270 MHz | ASUS EN7800GTX @ 490/1300 | Samsung SP2504C | Plextor PX-712SA | Logitech UltraX Media Keyboard | Razer Copperhead Chaos Green | Razer eXactMat | Sennheiser PC150
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#20

Re: Icon pixelfrei

  Alt 3. Feb 2008, 12:45
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 03:51 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