Czy ktoś wie o klasie, która potrafi czytać ikony wieloramkowe? Wyszukiwanie w Internecie nie wygenerowało żadnych informacji.Załaduj ikony MultiFrame
Próbowałem używać IconTools 2.0 przez Alana Petera Stotza, który ładuje ikony do listy poprawnie, ale głębia bitowa dla ikon 8-bitowych i 4-bitowych jest zwracana jako 0. Bitduszetka dla ramek ikon o wielkości 32 i 24-bitowej jest jednak zwracany poprawnie.
Ikona pojawia się poprawnie podczas przeglądania ... tylko bitdepth jest błędny dla wymienionych bitów.
EDIT # 2 baised na komentarzem TLama Oto niektóre niesprawdzone kod:
function NumberOfIcons (AFileName: string): integer;
var
iNumberOfIcons: Integer;
begin
iNumberOfIcons := ExtractIcon (hInstance, PChar (AFilename), UINT (-1));
Result := iNumberOfIcons;
end;
function ExtractAnIcon (AFilename: string; AIndex: integer): TBitmap;
var
icoHandle: HIcon;
iBitmap: TBitmap;
iIcon: TIcon;
iNumberOfIcons, i: Integer;
begin
Result := nil;
iBitmap := TBitMap.Create;
iIcon := TIcon.Create;
try
// Get the number of Icons
iNumberOfIcons := ExtractIcon (hInstance, PChar (AFilename), UINT (-1));
// Extract the icon frame
icoHandle := ExtractIcon (hInstance, PChar (AFileName), AIndex);
iIcon.Handle := icoHandle;
iBitmap.Width := iIcon.Width;
iBitmap.Height := iIcon.Height;
// Draw the icon on your bitmap
DrawIcon (iBitmap.Canvas.Handle, 0, 0, iIcon.Handle);
Result := iBitmap;
finally
iIcon.Free;
end;
end;
function PixelFormatToBitDepth (APixelFormat: TPixelFormat): integer;
// Convert TPixelFormat to integer
begin
Result := -1;
case APixelFormat of
pf32Bit:
Result := 32;
pf24bit:
Result := 24;
pf8bit:
Result := 8;
pf4Bit:
Result := 4;
pf1bit:
Result := 1;
end;
end;
Jestem na dobrej drodze? W moich testach mam teraz 1 ikonę, ale funkcja NumberOfIcons wraca 1?
EDIT # 3 Według pliku pomocy „Jeśli jest to plik .ico, wartość zwracana ExtractIcon to 1.” Jakiej metody można użyć, aby uzyskać liczbę ikon w pliku ico?
Planujesz edytować je dalej czy tylko chce je wykorzystać w programie? Jeśli to drugie, łatwiej jest połączyć je jako zasoby i użyć interfejsów API zasobów, aby uzyskać odpowiednią wersję ikony. –
@ David ... Próbuję użyć ich w ImageEditor, który ładuje bitmapy, więc gdy otrzymam ikonę potrzebuję przekonwertować go do bitmapy, a następnie uzyskać jego szerokość i wysokość i bitdepth. Próbuję użyć ExtractIcon do zrobienia tego baised na komentarz TLamas. Dodałem nietestowany kod jako edycję. – Bill
@Bill, ImageEditor dostarczany z Delphi? Jeśli tak, spróbuj zapomnieć o tym. Mam dobre doświadczenie, np. z IcoFX (jest też wersja przenośna), która pozwala eksportować ikony do kilku formatów (* .bmp włącznie). Ale nie musisz używać tylko map bitowych w plikach zasobów, możesz użyć dowolnego typu pliku, musisz tylko skompilować pliki zasobów. – TLama