Кто-нибудь знает класс, который может читать многокадровые значки? Поиск в интернете не дал никакой информации.
Я попытался использовать IconTools 2.0 от Алана Питера Стоца, который правильно загружает значки в список, но битовая глубина для 8-битных и 4-битных значков возвращается как 0. Битовая глубина для 32- и 24-битных фреймов значков составляет однако вернулся правильно.
Сама иконка выглядит правильно при просмотре... просто битовая глубина неверна для упомянутых битов.
РЕДАКТИРОВАТЬ #2 Основываясь на комментарии TLama, вот непроверенный код:
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;
Я на правильном пути? В моем тестировании я теперь получаю 1 значок, но функция NumberOfIcons возвращает 1?
РЕДАКТИРОВАТЬ №3 Согласно файлу справки «Если файл является файлом .ICO, возвращаемое значение ExtractIcon равно 1». Итак, какой метод можно использовать для получения количества значков в файле ico?