Jpg beolvasás index képbe (előnézeti kis kép)
2011-12-20T08:16:34+01:00
2011-12-21T13:43:02+01:00
2022-08-05T06:30:30+02:00
padro
Sziasztok!

Képek kiválogatását szeretném úgy segíteni, hogy megjelenítem kicsinyített változatukat.
Meglehetősen lassú a folyamat, melyben TImage-k Picture-jébe töltöm a LoadFromFile metódussal a képeket.
Az átméretezés után a Stretch tulajdonság True-ra állításával helyezem el a képeket a kívánt négyzetekbe.
Azt szeretném megkérdezni, hogy létezik-e ennél hatékonyabb megoldás.
Mutasd a teljes hozzászólást!
Nézd meg ezt.

Vagy a fast load thumb bitmap delphi alapján tovább keresgetnék.

Mutasd a teljes hozzászólást!


  • A TJvImagesViewer pont erre való. (Jedi komponens)

    Mutasd a teljes hozzászólást!
  • BMP-re jól működik, megpróbálom valahogy rávenni, hogy JPG-vel is menjen.
    Mutasd a teljes hozzászólást!
  • Megkerestem, de, amikor installálni akartam a komponenst, hiányolt két inc kiterjesztésű file-t. A másodiknál feladtam.
    Mutasd a teljes hozzászólást!
  • Megy már JPG-vel is, de hatékonyságról nemigen lehet beszélni.
    Nagyon lassan olvas fel 60-70 képet. A demó program a már betöltött BMP-t kicsinyíti.
    Megközelítőleg olyan sebességet szeretnék, mint a Windows Intéző, mikor előnézeti képet készít akkor, amikor még nincs gyorsítótárban a képhalmaz.
    Mutasd a teljes hozzászólást!
  • A hatékonyásgon úgy lehet javítani, hogy létrehozol egy thread pool-t. Így egy 4 magos gépen 300%-kal gyorsabb lesz.
    Pont egy ilyen thumbnail-ezéshez írtam egy komponenenst, aminek csak beállítod, hogy hány szál fusson egyszerre és szálazva lehet feladatokat adni neki. Ha úgy döntesz, hogy hasnzálod tudok segíteni.
    Mutasd a teljes hozzászólást!
  • És van még egy módszer!

    Nem tudom milyen Delphi-t használsz, de a 2009-esig a JPEG unit hibás (újabbal nem próbáltam), és ha szálból használod akkor keményen szivárog a memória. Úgy vettem ki kb. az egész bitmap bentmarad a memóriában felszabadítás után. Nyitottam is akkoriban egy topic-ot, hogy melyik a legjobb JPEG kezelő megoldás Delphi-hez és a szubjektí véleményem, hogy a Free Image Library-t érdemes a leginkább használni.
    Gyorsabb mint a Delphi-is JPEG unit, és van egy olyan paramétere is, hogy a JPEG csak 1/8-adát, 1/4-edét töltse be. Ezzel is plusz komoly gyorsulást lehet elérni, és szálbiztos is.
    Mutasd a teljes hozzászólást!

  • Megkerestem, de, amikor installálni akartam a komponenst, hiányolt két inc kiterjesztésű file-t. A másodiknál feladtam.


    Jól tetted! Ami nem megy, azt nem is kell erőltetni.

    Mutasd a teljes hozzászólást!
  • Ha olyan kell, mint a windowsé, miért nem kéred el a windowstól?
    IExtractImage
    Mutasd a teljes hozzászólást!
  • Hello!

    Itt megtalálod, amire szükséged van!

    thumb

    Eric
    Mutasd a teljes hozzászólást!
  • Jól tetted! Ami nem megy, azt nem is kell erőltetni.


    Hogy némileg élét vegyem ennek a mondatnak, csak annyit, hogy elég kevés időm van. Kerestem a második inc-et is, de nem jártam eredménnyel.
    Mutasd a teljes hozzászólást!

  • Nincs is ezzel semmi baj. Velem van a gond, mert az opportunizmus mint olyan, hiányzik a szótáramból.

    Mutasd a teljes hozzászólást!
  • Azért kiváncsi lennék, hogy az IExtractImage-es módszer vagy egy szálazott Free Image-es 1/8-os módszer a gyorsabb?
    Mutasd a teljes hozzászólást!
  • Egyébként van unit-om is ehhez az IExtractImage-hez:

    unit WinThumb; interface Uses Windows, SysUtils, ActiveX, ShlObj; function GetWinThumb(FileName: String; Width, Height: Integer; OwnerHandle: HWND): HBitmap; implementation type IExtractImage = interface ['{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}'] function GetLocation( pszwPathBuffer: PWideChar; cch: DWORD; var dwPriority: DWORD; var rgSize: TSize; dwRecClrDepth: DWORD; var dwFlags: DWORD): HResult; stdcall; function Extract(var hBmpThumb: HBITMAP): HResult; stdcall; end; Const MinSize = 52; MaxSize = 256; ColorFormat: DWord = 24; IEIFLAG_OFFLINE = 8; IEIFLAG_SCREEN = $20; function GetWinThumb(FileName: String; Width, Height: Integer; OwnerHandle: HWND): HBitmap; var Path, Name: String; FolderISF, DesktopISF: IShellFolder; IExtractImg: IExtractImage; Attrib, Eaten: DWORD; PItemIDL: PItemIDList; MemAlloc: IMalloc; CharBuf: array[0..2047] of WideChar; HBmp: HBITMAP; Size1: TSize; Priority, Flags: Cardinal; GLResult: HResult; begin Result := 0; CoInitialize(nil); if Width > MaxSize then begin Width := MaxSize; end else begin if Width < MinSize then begin Width := MinSize; end; end; if Height > MaxSize then begin Height := MaxSize; end else begin if Height < MinSize then begin Height := MinSize; end; end; if (FileName = '') OR (NOT FileExists(FileName)) then begin Exit; end; Path := ExtractFilePath(FileName); Name := ExtractFileName(FileName); if NOT ((Win32Platform = VER_PLATFORM_WIN32_NT) AND (Win32MajorVersion >= 5)) then begin Exit; end; if (SHGetMalloc(MemAlloc) <> NOERROR) OR (MemAlloc = nil) OR (NOERROR <> SHGetDesktopFolder(DesktopISF)) then begin Exit; end; if DesktopISF.ParseDisplayName(OwnerHandle, nil, StringToOleStr(path), Eaten, PItemIDL, Attrib) <> NOERROR then begin Exit; end; DesktopISF.BindToObject(PItemIDL, nil, IShellFolder, FolderISF); MemAlloc.Free(PItemIDL); if FolderISF.ParseDisplayName(OwnerHandle, nil, StringToOleStr(name), Eaten, PItemIDL, Attrib) <> NOERROR then begin Exit; end; FolderISF.GetUIObjectOf(OwnerHandle, 1, pItemIDL, IExtractImage, nil, IExtractImg); MemAlloc.Free(PItemIDL); if IExtractImg = nil then begin Exit; end; Size1.cx := Width; Size1.cy := Height; Flags := IEIFLAG_SCREEN or IEIFLAG_OFFLINE; Priority := 0; GLResult := IExtractImg.GetLocation(CharBuf, sizeof(CharBuf), Priority, Size1, ColorFormat, Flags); if (GLResult = NOERROR) OR (GLResult = E_PENDING) then begin if (IExtractImg.Extract(HBmp) <> NOERROR) OR (HBmp = 0) then begin Exit; end; Result := hBmp; end; CoUnInitialize; end; end.

    A CoInitialize() és a CoUnInitialize() csak akkor kell ha szálból hívod meg! És ezzel a módszerrel max 256x256-os thumbnail-t lehet kreálni.
    Mutasd a teljes hozzászólást!
  • Köszönöm mindenkinek a segítő szándékot.
    Egy nyomon elindultam (kistikvi beszúrt linkje alapján) és rész sikereket el is értem. Nem lett gyorsabb a betöltés, viszont nagyságrenddel kevesebb memória fogy.
    Te viszont saját kódot adtál, amit még szeretnék kipróbálni. Ehhez idő kell, ezért kis türelmet kérek a pontok odaadásában.
    Mutasd a teljes hozzászólást!
abcd