有谁知道可以读取多帧图标的类?搜索互联网并没有产生任何信息。加载多帧图标
我试着用Alan Peter Stotz的IconTools 2.0,它将图标正确加载到列表中,但8位和4位图标的位深度返回为0. 32位和24位图标帧的位深度返回正确,但是。
查看时,图标本身显示正确...只是所述位的位深度错误。
编辑#2 由TLama评论Baised这里是一些未经测试的代码:
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文件中的图标数量?
你打算做进一步的编辑或者你只是想在程序中使用它们?如果后者更容易将它们作为资源链接并使用资源API来获取正确版本的图标。 – 2012-03-21 13:58:06
@David ...我想在加载位图的ImageEditor中使用它们,所以一旦我得到图标,我需要将它转换为位图,然后获取它的宽度和高度以及位深度。我正在尝试使用ExtractIcon来完成TLamas评论。我添加了未经测试的代码作为编辑。 – Bill 2012-03-21 14:07:21
@Bill,Delphi附带的ImageEditor?如果是这样,那就试着忘记它。我有一个很好的经验,例如与IcoFX(也有它的便携式版本),它允许您将图标导出为多种格式(* .bmp包括)。但是你不需要在资源文件中只使用位图,你可以使用任何文件类型,你只需要自己编译资源文件。 – TLama 2012-03-21 14:33:18