Delphi-PRAXiS
Seite 1 von 3  1 23      

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)

Nils_13 2. Feb 2008 10:53


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.

Lossy eX 2. Feb 2008 11:21

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.

phXql 2. Feb 2008 11:23

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.

Lossy eX 2. Feb 2008 11:35

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.

CalganX 2. Feb 2008 11:38

Re: Icon pixelfrei
 
AntiAliasingAntiAliasing liefert mir u.A. das hier

Christopher

Nils_13 2. Feb 2008 12:01

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:

Gausi 2. Feb 2008 12:24

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.

Nils_13 2. Feb 2008 12:28

Re: Icon pixelfrei
 
Delphi-Quellcode:
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;
So hole ich mir das Icon. Das Bild auf das ich es zuweise hat Transparent auf True.

Lossy eX 2. Feb 2008 12:40

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.

Nils_13 2. Feb 2008 13:13

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 00:48 Uhr.
Seite 1 von 3  1 23      

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