4

我正在开发一个基于外壳的列表视图。尝试提取外壳图标/图像时...如果失败,我尝试使用 IExtractImage 提取缩略图我尝试使用 IExtractIcon 提取图标,以获得最大的图标大小,但 IExtractIcon 给出奇怪的结果。问题是我尝试使用从图像列表中提取图标的方法,但如果没有大图标(256x256),它将在图标的左上角呈现较小的图标,这看起来不太好。这就是为什么我尝试改用 IExtractIcon 的原因。但是在我的图像列表提取方法中显示为 256x256 图标的图标报告图标大小为 33 大和 16 小。那么如何检查是否存在大(256x256)图标?如果您需要更多信息,我可以提供一些示例代码。

if PThumb.Image = nil then
begin
  OleCheck(ShellFolder.ParseDisplayName(0, nil, StringToOleStr(PThumb.Name), Eaten, PIDL, Atribute));
  ShellFolder.GetUIObjectOf(0, 1, PIDL, IExtractIcon, nil, XtractIcon);
  CoTaskMemFree(PIDL);
  bool:= False;
  if Assigned(XtractIcon) then
  begin
    GetLocationRes := XtractIcon.GetIconLocation(GIL_FORSHELL, @Buf, sizeof(Buf), IIdx, IFlags);
    if (GetLocationRes = NOERROR) or (GetLocationRes = E_PENDING) then
    begin
      Bmp := TBitmap.Create;
      try
        OleCheck(XtractIcon.Extract(@Buf, IIdx, LIcon, SIcon, 32 + (16 shl 16)));
        Done:= False;

罗伊·M·克莱弗

4

1 回答 1

-1

获取 256x256 位图并简单地检查 alpha。确保 bmp 为 32 位。任何像素值为 0 的部分(即 BGRA 0,0,0,0,用于TBitmap.Scanline访问)都是透明的。您可以找到具有非零值的最小 x 和最小 y 坐标,这就是您的图标的实际大小。现在,这个数字可能小于设计时的“图标大小”。例如,一个 16x16 的图标可以包含一个 2x2 的图像,这将是一个奇怪的设计。

当然,一个 8x16 的图标是很有可能的。考虑到图像总是正方形的,如果找到 x 和 y 坐标(实际图像的高度和高度),取最大值并将其四舍五入到最接近的 16、24、32、48、64、128 或 256。您可以确定如果你接下来裁剪到这个大小,你的图标就会在你的位图中居中。Use Bmp.Width=sz; Bmp.Height=sz;. 然后你可以放大它,或者把它放在你的标准位图上(56x56?256x256?)。

因此,即使 Windows 不想为您提供正确的信息,您也可以通过简单地找出自己来绕过对这些信息的需求。这可能不是“正确”的方法,但你会知道它会在你完成后工作,而不是浏览 MSDN 4 小时而永远找不到答案。

于 2011-07-22T02:06:54.580 回答