Перед тем как запостить тему на форуме, естественно задал свой вопрос чату gpt. В моей задаче имеется в виду это: Искусственный разум предлагает совсем колоритные решения, например запускать для этого ffmpeg.exe: Код (Text): uses Windows, SysUtils, ShellAPI; procedure GenerateThumbnail(const VideoFile: string; const OutputImage: string); begin // Запуск FFmpeg для генерации миниатюры ShellExecute(0, 'open', 'ffmpeg.exe', PChar(Format('-i "%s" -ss 00:00:01.000 -vframes 1 "%s"', [VideoFile, OutputImage])), nil, SW_HIDE); end; procedure TForm1.Button1Click(Sender: TObject); var VideoFile: string; ThumbnailFile: string; begin VideoFile := 'C:\path\to\your\video.mp4'; // Путь к вашему видеофайлу ThumbnailFile := 'C:\path\to\your\thumbnail.png'; // Путь для сохранения миниатюры GenerateThumbnail(VideoFile, ThumbnailFile); // Теперь вы можете загрузить изображение в TImage Image1.Picture.LoadFromFile(ThumbnailFile); end; Или вот: Код (Text): procedure GetVideoThumbnail(const VideoFile: string; const OutputImage: string); var WMP: OleVariant; begin // Создаем экземпляр Windows Media Player WMP := CreateOleObject('WMPlayer.OCX.7'); // Загружаем видеофайл WMP.URL := VideoFile; Sleep(1000); // Даем время для загрузки файла // Получаем миниатюру try WMP.Controls.currentPosition := 1; // Позиция в 1 секунду WMP.Controls.pause; // Пауза для получения миниатюры // Сохраняем миниатюру WMP.currentMedia.GetPicture(OutputImage); finally WMP.close; // Закрываем WMP end; end; procedure TForm1.Button1Click(Sender: TObject); var VideoFile: string; ThumbnailFile: string; begin VideoFile := 'C:\path\to\your\video.mp4'; // Путь к вашему видеофайлу ThumbnailFile := 'C:\path\to\your\thumbnail.jpg'; // Путь для сохранения миниатюры GetVideoThumbnail(VideoFile, ThumbnailFile); // Загружаем миниатюру в TImage Image1.Picture.LoadFromFile(ThumbnailFile); end;
Делаю проект в delphi 7. Получается чтобы получить то же самое надо экспортировать interface/методы из IThumbnailProvider interface? ( Код (Text): const CLSID_ThumbnailProvider: TGUID = '{F2F0B0F3-FA54-45C8-BD0E-33D41E6F6B0D}'; IID_IThumbnailProvider: TGUID = '{F1F5D0B1-6DF4-4C87-B20D-7FB3B665C86F}'; type IThumbnailProvider = interface(IUnknown) ['{F1F5D0B1-6DF4-4C87-B20D-7FB3B665C86F}'] function GetThumbnail(size: Integer; flags: Cardinal; out hBitmap: HBITMAP): HResult; stdcall; end; type IShellItem = interface(IUnknown) ['{00000000-0000-0000-0000-000000000000}'] function GetDisplayName(pszNameBuf: PWideChar; cchNameBuf: Cardinal; sig: Cardinal): HResult; stdcall; function GetAttributes(dwMask: Cardinal; out dwAttrib: Cardinal): HResult; stdcall; function Compare(refiid: TGUID; pithes6: IShellItem; out result: Cardinal): HResult; stdcall; // Добавьте здесь другие необходимые методы end; // Ваша процедура получения миниатюры procedure GetThumbnail(const FilePath: string; Image: TImage); var ShellItem: IShellItem; ThumbnailProvider: IThumbnailProvider; hBitmap: HBITMAP; Size: SIZE; begin // Инициализация COM CoInitialize(nil); try // Создание IShellItem из пути файла if Succeeded(SHCreateItemFromParsingName(PChar(FilePath), nil, IShellItem, ShellItem)) then begin // Получение интерфейса IThumbnailProvider if Succeeded(ShellItem.BindToHandler(nil, BHID_ThumbnailProvider, IThumbnailProvider, ThumbnailProvider)) then begin // Установка размера миниатюры Size.cx := 128; // Ширина Size.cy := 128; // Высота // Получение миниатюры if Succeeded(ThumbnailProvider.GetThumbnail(Size.cy, 0, hBitmap)) then begin // Установка миниатюры в компонент TImage Image.Picture.Bitmap.Handle := hBitmap; Image.Refresh; // Освобождение ресурса битmaps (необходимо, чтобы избежать утечек памяти) DeleteObject(hBitmap); end; end; end; finally CoUninitialize; end; end;
Получаешь IShellItemImageFactory через вызов SHCreateItemFromParsingName. Далее вызываешь метод GetImage в котором получаешь HBITMAP превью. Код (C++): #include <windows.h> #include <Shobjidl.h> int main() { HRESULT hr; IShellItemImageFactory *pImgFactory = NULL; SIZE sz; HBITMAP hBmp = NULL; HWND hWnd = NULL; HDC hDC = NULL, hDCBuf = NULL; if (FAILED(hr = CoInitialize(NULL))) { goto CleanUp; } if (FAILED(hr = SHCreateItemFromParsingName(L"Stay.2005.BDRip-AVC.mkv", NULL, IID_IShellItemImageFactory, (void**)&pImgFactory))) { goto CleanUp; } sz.cx = 256; sz.cy = 256; if (FAILED(hr = pImgFactory->GetImage(sz, SIIGBF_THUMBNAILONLY | SIIGBF_RESIZETOFIT, &hBmp))) { goto CleanUp; } if (NULL == (hWnd = CreateWindow(L"#32770", NULL, WS_POPUP | WS_VISIBLE, 200, 200, 200, 200, NULL, NULL, NULL, NULL)) || NULL == (hDC = GetDC(hWnd)) || NULL == (hDCBuf = CreateCompatibleDC(hDC))) { goto CleanUp; } SaveDC(hDCBuf); SelectObject(hDCBuf, hBmp); BitBlt(hDC, 0, 0, 256, 256, hDCBuf, 0, 0, SRCCOPY); RestoreDC(hDCBuf, -1); CleanUp: if (hDC) ReleaseDC(hWnd, hDC); if (hDCBuf) DeleteDC(hDCBuf); if (hBmp) DeleteObject(hBmp); if (hWnd) DestroyWindow(hWnd); if (pImgFactory) pImgFactory->Release(); return hr; }
Оказывается в delphi 7 в ShlObj.pas мало что есть от shobjidl. Нет IShellItemImageFactory, SHCreateItemFromParsingName. Коварные предатели из borland'a не смогли преусмотреть, что через 20 лет я буду решать эту задачу на delphi 7. Спасибо за код. Попробую перевести его через llm'ки.