Ver Mensaje Individual
  #7  
Antiguo 07-03-2012
manuc manuc is offline
Miembro
 
Registrado: abr 2010
Posts: 165
Reputación: 15
manuc Va por buen camino
Ok, pues te dejo esta función que hace justo lo que quieres.

Con esta función puedes generar el thumbnail, a apartir de la ruta hasta el fichero. Hay varias formas de hacer esto, pero esta es la que mejor me ha funcionado.

Código Delphi [-]
function GetThumbnail(lpPathName, lpFileName: PWideChar; Width, Height: Integer): TBitmap;
var
 Desktop, Folder: IShellFolder;
 ItemIDList: PItemIDList;
 Flags, Priority: Cardinal;
 ExtractImage: IExtractImage;
 Res: HRESULT;
 hBitmap: Windows.HBITMAP;
 Buffer: array[0..MAX_PATH-1] of WideChar;
 Size: TSize;
begin
  Result := nil;
  SHGetDesktopFolder(Desktop);
  if LongBool(Desktop.ParseDisplayName(0, nil, lpPathName, PDWORD(0)^, ItemIDList, PDWORD(0)^)) then Exit;
  Desktop.BindToObject(ItemIDList, nil, IShellFolder, Folder);
  CoTaskMemFree(ItemIDList);
  if LongBool(Folder.ParseDisplayName(0, nil, lpFileName, PDWORD(0)^, ItemIDList, PDWORD(0)^)) then Exit;
  Folder.GetUIObjectOf(0, 1, ItemIDList, IExtractImage, nil, ExtractImage);
  CoTaskMemFree(ItemIDList);
  if not Assigned(ExtractImage) then Exit; // TODO
  Size.cx := Width; Size.cy := Height; Priority := 0;
  Flags := $28{IEIFLAG_SCREEN+IEIFLAG_OFFLINE};
  Res := ExtractImage.GetLocation(Buffer, SizeOf(Buffer), Priority, Size, 24{pf32bit}, Flags);
  if (Res = NOERROR) or (Res = E_PENDING{IEIFLAG_ASYNC}) then
  begin
    if not LongBool(ExtractImage.Extract(hBitmap)) then
    begin
     Result := TBitmap.Create;
     Result.Handle := hBitmap;
    end;
  end;
end;

¿cómo utilizarla? Por ejemplo:
Código Delphi [-]
Var
  bmp:TBitmap;
  vFichero:WideString;
  vRuta:WideString;
begin
  vRuta    := ExtractFilePath(path_fichero_pdf);
  vFichero := ExtractFilename(path_fichero_pdf);

  bmp := GetThumbnail(PWideChar(vRuta), PWideChar(vFichero), 122, 200);
  Image1.Picture.Assign(bmp);
  freeandnil(bmp)

Espero que te ayude.
Cualquier cosa, consulta sin problemas.

Un saludo.
Responder Con Cita