*.ico unterschiedliche Grösse

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

*.ico unterschiedliche Grösse

Beitrag von Mathias »

Unter Windows hat das Icon 32x32 Pixel.
Aber unter Linux hat es 128x128 Pixel.

Woher kommt das ?

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  pic: TPicture;
begin
  pic := TPicture.Create;
  pic.LoadFromFile('project1.ico');
 
  Caption := IntToStr(pic.Width);
 
  pic.Free;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: *.ico unterschiedliche Grösse

Beitrag von wp_xyz »

Weil eine ico-Datei dasselbe Bild in verschiedenen Größen enthält - ico-Datei (z.B. (lazarus)/images/icons/lazarus.ico) mit IrfanView öffnen, in der Statuszeile steht rechts 1/6, also Bild 1 von 6. Das Icon mit dem roten Abwärtspfeil (über den drei Blättern) klicken wechselt zum nächsten Bild --> es kommt jedes mal dasselbe Bild, nur in verschiedenen Größen. Alternativ kannst du auch in den Projektoptionen > "Anwendung" mit der Trackbar unter dem angezeigten Icon alle vorhandenen Größen durchgehen.

Die Anwendung sucht sich dann je nach Auflösung und Anforderung (in Windows "große"/"mittelgroße"/"kleine" Symbole) das entsprechende Bild heraus bzw. interpoliert aus den vorhandenen auf die gewünschte Größe.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: *.ico unterschiedliche Grösse

Beitrag von Mathias »

Weil eine ico-Datei dasselbe Bild in verschiedenen Größen enthält

Dies ist mir bekannt, was mich mehr interessiert, wieso öffnet LoadFromFile das Icon auf verschiedener weise ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: *.ico unterschiedliche Grösse

Beitrag von wp_xyz »

Meine VM mit Linux Mint 18.1 holt sich ebenfalls das Icon mit der Größe 32x32, die VM mit Ubuntu dagegen das mit der Größe 128x128.

Am Ende von TCustomIcon.ReadStream wird eine Routine "CheckRequestedSize" aufgerufen, in der über GetSystemMetrics(SM_CXICON) and ...(SMCYICON) die im aktuellen Betriebssystem/Theme gewünschte Standard-Icon-Größe ermittelt wird. Dies bestimmt dann den Index für das auszuwählende Bild (Current).

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  pic: TPicture;
begin
  pic := TPicture.Create;
  pic.LoadFromFile('project1.ico');
 
  Caption := 'Icon width: ' + IntToStr(pic.Width) + ' Current: ' + IntToStr(pic.Icon.Current) +
    ' SystemMetrics(SM_CXICON): ' + IntToStr(GetSystemMetrics(SM_CXICON));
 
  pic.Free;
end

GetSystemMetrics ergibt bei mir für Windows und Mint den Wert 32, für Ubuntu 128; entsprechend hat der Bildindex Current bei Windows/Mint den Wert 4, bei Ubuntu den Wert 1.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: *.ico unterschiedliche Grösse

Beitrag von Mathias »

Meine VM mit Linux Mint 18.1 holt sich ebenfalls das Icon mit der Größe 32x32

Ich habe auch Mint 18.1 und dort habe ich 128 Pixel. Hast du auch die 64-Bit Version von Mint ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4888
Registriert: Fr 8. Apr 2011, 09:01

Re: *.ico unterschiedliche Grösse

Beitrag von wp_xyz »

Nein, aber ich glaube nicht, dass es an den 32/64-Bit liegt, sondern an den Themes/Desktop Manager oder wie das alles heißt. In dem Mint 18.1 mit den 32er Icons habe ich KDE, in einem 18.0 mit Mate kommen die Icons auch in Größe 128x128. Beide sind 32 Bit.

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: *.ico unterschiedliche Grösse

Beitrag von Mathias »

Ich verwende "Cinnamon".
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: *.ico unterschiedliche Grösse

Beitrag von Mathias »

Wie ist es möglich, auf die einzelnen Ebenen zuzugreifen ?

Geht dies mit TPicture, oder braucht man da etwas anderes ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: *.ico unterschiedliche Grösse

Beitrag von Michl »

Hier geht sowas (habs nur kurz in 5 Minuten probiert, keine Ahnung, ob's anders/besser geht):

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
var
  aIcon: TIcon;
  aBitmap: TBitmap;
  OfsX, i: Integer;
begin
  OfsX := 0;
  aIcon := TIcon.Create;
  aBitmap := TBitmap.Create;
  try
    aIcon.LoadFromFile('project1.ico');
    for i := 0 to aIcon.Count - 1 do
    begin
      aIcon.Current := i;
      aBitmap.Assign(aIcon);
      Canvas.Draw(OfsX, 0, aBitmap);
      Inc(OfsX, aIcon.Width);
    end;
  finally
    aBitmap.Free;
    aIcon.Free;
  end;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: *.ico unterschiedliche Grösse

Beitrag von Mathias »

Hier geht sowas (habs nur kurz in 5 Minuten probiert, keine Ahnung, ob's anders/besser geht):

Danke, TIcon ist der springende Punkt.
Der Umweg über TBitmap kann man sich sparen.

Es gibt sogar ein RawImage.

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
var
  aIcon: TIcon;
  OfsX, i: Integer;
begin
  OfsX := 0;
  aIcon := TIcon.Create;
  try
    aIcon.LoadFromFile('project1.ico');
    for i := 0 to aIcon.Count - 1 do
    begin
      aIcon.Current := i;
      Canvas.Draw(OfsX, 0, aIcon);
      Inc(OfsX, aIcon.Width);
    end;
  finally
    aIcon.Free;
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten