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 1 von 3  1 23      
Nils_13

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

Icon pixelfrei

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

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

Re: Icon pixelfrei

  Alt 2. Feb 2008, 12:21
Nun ja. Wenn du Icon/Bilder ausliest es wohl zu erwarten, dass du Pixel bekommst, oder? Den konnte ich mir nicht verkneifen.

Ich kann mir darunter allerdings gerade nicht viel vorstellen. Evtl solltest du mal ein Bild posten wo man das Problem sehen kann.
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 phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#3

Re: Icon pixelfrei

  Alt 2. Feb 2008, 12:23
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.
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

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

Re: Icon pixelfrei

  Alt 2. Feb 2008, 12:35
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.
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
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Icon pixelfrei

  Alt 2. Feb 2008, 12:38
AntiAliasingAntiAliasing liefert mir u.A. das hier

Christopher
  Mit Zitat antworten Zitat
Nils_13

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

Re: Icon pixelfrei

  Alt 2. Feb 2008, 13:01
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:
Miniaturansicht angehängter Grafiken
algo2_124.png   algo1_196.png  
  Mit Zitat antworten Zitat
Benutzerbild von Gausi
Gausi

Registriert seit: 17. Jul 2005
878 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Icon pixelfrei

  Alt 2. Feb 2008, 13:24
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.
  Mit Zitat antworten Zitat
Nils_13

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

Re: Icon pixelfrei

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

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

Re: Icon pixelfrei

  Alt 2. Feb 2008, 13:40
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.
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
 
#10

Re: Icon pixelfrei

  Alt 2. Feb 2008, 14:13
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 23:15 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