![]() |
Icon pixelfrei
Hi,
ich lese mit einer Funktion Icons von Programmen aus und zeichne sie mit Canvas. Nun habe ich aber ziemlich viele Pixel. Kann man das irgendwie wegbekommen ? Ich habe bis jetzt zu dem Thema nur einen brauchbaren (so schien es am Anfang...) Thread gefunden, der aber keine Lösung enthielt. AntiAliasing wird wohl nötig sein. Habe zu dem Thema aber wirklich fast nichts gefunden. |
Re: Icon pixelfrei
Nun ja. Wenn du Icon/Bilder ausliest es wohl zu erwarten, dass du Pixel bekommst, oder? Den konnte ich mir nicht verkneifen. :P
Ich kann mir darunter allerdings gerade nicht viel vorstellen. Evtl solltest du mal ein Bild posten wo man das Problem sehen kann. |
Re: Icon pixelfrei
Was er will ist Kantenglättung... Bei Antialiasing wird das Bild erst z.b. 2x so groß gerechnet und dann auf Zielgröße verkleinert. Damit verschwinden die Pixelkanten.
|
Re: Icon pixelfrei
Dessen bin ich mir durchaus bewusst. Aber mir stellt sich die Frage was das mit Icons zu tun hat? Außer höchsten 32x32 Icons auf 16x16 zu rechnen. Was aber kein AntiAliasing ist. Das ist aber genau das was ich in Erfahrng bringen wollte.
|
Re: Icon pixelfrei
|
Re: Icon pixelfrei
Liste der Anhänge anzeigen (Anzahl: 2)
AntiAliasing hat hier aber nicht viel gebracht. Schaut euch vorallem die beiden obersten Icons an, der weiße Mist in der Mitte muss auf jeden Fall weg. Habe zwei verschiedene Algos getestet:
|
Re: Icon pixelfrei
Das sieht für mich eher danach aus, als gäbe es da ein Problem mit der Transparenz bzw. dem Alpha-Kanal in den Icons.
|
Re: Icon pixelfrei
Delphi-Quellcode:
So hole ich mir das Icon. Das Bild auf das ich es zuweise hat Transparent auf True.
function GetIcon(filename : String; IconIndex: Integer) : TBitmap;
var NumberOfIcons : Integer; Ico : TIcon; 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); Result := TBitmap.Create; with Result do begin Width := Ico.Width; Height := Ico.Height; Canvas.Draw(0, 0, Ico); end; Ico.Free; end; |
Re: Icon pixelfrei
Bitte nicht AntiAliasing mit stumpfen Weichzeichnem verwechseln. Nur weil die Methode Antialiasing heiß bedeutet das nicht, dass die auch gleiches tut. Das ist ein Trugschluss. Und in den Fall könnte es von richtigem AntiAlising nicht weiter entfernt sein. Okay die Kanten sind weich aber der Recht ist auch matschig.
Nils_13: Das Zauberwort heißt Alphakanal. Seit Windows XP können Icons 24 Bit Farbtiefe enthalten und einen 8Bit Alphakanal. In deinem Fall wird aus dem 8 Bit Alphakanal eine 1 Bit Maske. Das ist aber nicht so gut, denn dadurch entstehen eben solche Kanten. Wie beim FF. Schau dir mal die Funktion GetIconInfo an. Du musst du das Handle des Icons übergeben und bekommst eine Struktur in der 2 Bitmaps enthalten sind. Ein mal das Normale RGB Bild und ein Mal die Maske. Die Maske sollte richtige 8Bit Transparenz enthalten. Diese muss du beim Zeichnen des Icons berücksichtigen. Und dabei darfst du eigenschaft Tranzparent des TBitmaps nicht benutzen. Du musst das Bild richtig blenden. Dann werden sie auch so aussehen wie sie sollen. |
Re: Icon pixelfrei
Habe eine Funktion gefunden. Das Ergebnis sieht zwar besser aus, aber nicht gut genug. Es werden die weiten Pixel geschwärzt. Könnte man anstelle von Schwarz nicht einfach die Hintergrundfarbe nehmen und es wäre alles flüssig ?
Delphi-Quellcode:
function IconToBitmap(const IconHandle : HIcon) : TBitmap;
var IcoInfo : TIconInfo; Mask : TBitmap; X, Y : Word; begin Mask := nil; Result := nil; if not GetIconInfo(IconHandle, IcoInfo) then Exit; try try Result := TBitmap.Create; Result.Handle := IcoInfo.hbmColor; Result.PixelFormat := pf32bit; Mask := TBitmap.Create; Mask.Handle := IcoInfo.hbmMask; Mask.PixelFormat := pf32bit; for X := 0 to Result.Width-1 do for Y := 0 to Result.Height-1 do pRGBALine(Result.Scanline[Y])^[X].rgbReserved := not pRGBALine(Mask.Scanline[Y])^[X].rgbRed; except FreeAndNil(Result); end; finally if Assigned(Mask) then Mask.Free; end; end; function GetIcon(filename : String; IconIndex: Integer) : TBitmap; var NumberOfIcons : Integer; Ico : TIcon; 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); Result := IconToBitmap(Ico.Handle); Result.Canvas.Draw(0, 0, Ico); Ico.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 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-2025 by Thomas Breitkreuz