Использование Delphi Shell IExtractIcon и результат - PullRequest
4 голосов
/ 13 июня 2010

Я занимаюсь созданием списков на приманке.При попытке извлечь значок / изображение оболочки ... Я пытаюсь извлечь миниатюру, используя 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;

Рой М Клевер

1 Ответ

0 голосов
/ 22 июля 2011

Возьмите свое растровое изображение 256x256 и просто проверьте альфа. Убедитесь, что 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 часов и отсутствия ответа.

...