Das OFFIZIELLE PROFAN SUPPORT FORUM
Einsteigerfragen
PROFAN-Programmierung
Helfer & Tools
Anregungen & Vorschläge
PROFAN-NEWS
Die Regeln!
2 - PROFAN-Programmierung

 Neues Thema  |  Zur Übersicht  |  Suchen  |  Einloggen   Neuerer Beitrag  |  Älteres Thema 
 Thumbnails erstellen
Autor: Marco Lenz (---.adsl.alicedsl.de)
Datum:   21.05.10 18:36

Hy, ich suche grad eine Möglichkeit schnell Thumbnails zu erstellen. Hat jemand eine Idee ? Dabei gehts mir nicht unbedingt ums Speichern, sondern ums Laden, Verkleinern und Ausgeben. Weder hsizedpic noch die prospeedDLL liefern hier annehmbare Ergebnisse. Ich hab mal den Test mit einem Verzeichnis gemacht, indem 10 Bilder liegen, alle 3072x2304 (Digicam) ... und bei beiden Methoden kann man zuschauen, bis alle 10 Minibilder geladen sind. Gibts ne Möglichkeit/Methode, das Bild binär in den Speicher zu laden, aber nur zb jeden 10. Pixel daraus zu nehmen, um ein HDC/Bild zu erstellen ?!

mein prospeedDLL Code
 text$=Bildpfad$+ListBoxItem$(TLindex%+TElauf&-1)
 hdc&=LoadFileImage(Addr(text$))
 SizeImage(%hdc,0,30+(TLpixelgr%*(TElauf&-1)),TLpixelgr%,TLpixelgr%,HDC&,0,0,GetWidthImage(hdc&),GetHeightImage(hdc&),0)
 FreeImage(hdc&)
 


und hier mit profanmittel
 Let TEtempl& = @Create("hSizedPic", -1, Bildpfad$+ListBoxItem$(TLindex%+TElauf&-1) ,TLpixelgr%,TLpixelgr%, 1)
 DrawPic TEtempl&, 0,30+(TLpixelgr%*(TElauf&-1)); 0
 DeleteObject TEtempl&
 


Beides in einer Schleife, also 10 mal, dauert so einige Sekunden.

Hat jemand eine Idee ?

Marco

Reden ist Schweigen, Silber ist Gold !!!!

Beitrag beantworten
 
 Re: Thumbnails erstellen
Autor: Dieter Zornow (---.asianet.co.th)
Datum:   21.05.10 19:13

Versuch mal das, ist bei mir ziemlich schnell auch bei sehr großen Bildern.

 Proc InitGDIPlus
 Declare gdpsi#,gdiplusToken&
 STRUCT GdiplusStartupInput = GdiplusVersion&,DebugEventCallback&,SuppressBackgroundThread&,SuppressExternalCodecs&
 Dim gdpsi#,GdiplusStartupInput
 gdpsi#.GdiplusVersion& = 1
 gdpsi#.DebugEventCallback& = 0
 gdpsi#.SuppressBackgroundThread& = 0
 gdpsi#.SuppressExternalCodecs& = 0
 External("GDIPLUS.DLL","GdiplusStartup",ADDR(gdiplusToken&),gdpsi#,0)
 Dispose gdpsi#
 Return gdiplusToken&
 EndProc
 
 Proc ExitGDIPlus
 Parameters gdiplusToken&
 External("GDIPLUS.DLL","GdiplusShutdown",gdiplusToken&)
 Endproc
 
 Proc CatchImage
 Parameters MemPointer& ,Size&
     Struct GdiplusStartupInput = GdiplusVersion&,DebugEventCallback&,SuppressBackgroundThread&,SuppressExternalCodecs&
     Var GDIP& = ImportDll("Gdiplus.dll","")
     Var OLE& = ImportDll("Ole32.dll","")
     Var Kernel& = ImportDll("Kernel32.dll","")
     Declare gdpsi#,gdiplusToken&,ImageObject&,GraphicObject&,pStream&,RetVal&
     'GDIPlus starten
     Dim gdpsi#,GdiplusStartupInput
     gdpsi#.GdiplusVersion& = 1
     gdpsi#.DebugEventCallback& = 0
     gdpsi#.SuppressBackgroundThread& = 0
     gdpsi#.SuppressExternalCodecs& = 0
     GdiplusStartup(ADDR(gdiplusToken&),gdpsi#,0)
     Dispose gdpsi#
     'Speicher bereitstellen
     Var m_hBuffer& = GlobalAlloc(2,Size&)
     Var pBuffer& = GlobalLock(m_hBuffer&)
     RtlMoveMemory(pBuffer&,MemPointer&,Size&)
     GlobalUnlock(m_hBuffer&)
     'Stream erzeugen
     CreateStreamOnHGlobal(m_hBuffer&,1,Addr(pStream&))
     GdipCreateBitmapFromStream(pStream&,Addr(ImageObject&))
     'hBitmap erzeugen
     GdipCreateHBITMAPFromBitmap(ImageObject&,Addr(RetVal&),0)
     'aufräumen
     Var Command& = Long(pStream&,0)
     call(Long(Command&,8),pStream&)'IStream.Release
     GlobalFree(m_hBuffer&)
     GdipDisposeImage(ImageObject&)
     GdipDeleteGraphics(GraphicObject&)
     GdiplusShutdown(gdiplusToken&)
     FreeDll GDIP&
     FreeDll OLE&
     FreeDll Kernel&
     Return RetVal&
 EndProc
 
 
 cls
 declare mem#,size&
 var bild$ = Loadfile$("Bild laden","*.*")
 case bild$ = "":end
 size& = filesize(bild$)
 dim mem#,size&
 set("Filemode",0)
 Blockread(bild$,mem#,0,size&)
 set("filemode",2)
 var hBild& = CatchImage(mem#,sizeof(mem#))
 Dispose mem#
 declare Image&,Thumb&,hBitmap& 
 var hadl& = InitGDIPlus()
 External("GDIPLUS.DLL","GdipCreateBitmapFromHBITMAP",hbild&,0,addr(Image&))
 External("GDIPLUS.DLL","GdipGetImageThumbnail",Image&,200,200,addr(Thumb&),0,0) 'picture size
 External("GDIPLUS.DLL","GdipCreateHBITMAPFromBitmap",Thumb&,addr(hBitmap&),0)
 DrawPic hBitmap&,10,10;0
 ExitGDIPlus(hadl&)
 waitinput
 




Beitrag beantworten
 
 Re: Thumbnails erstellen
Autor: Marco Lenz (---.adsl.alicedsl.de)
Datum:   21.05.10 20:34

Hy, danke für den Code, aber ich hab xprof 10, und da gibts importdll nicht. Gibtsn workaround ?

Marco

Reden ist Schweigen, Silber ist Gold !!!!

Beitrag beantworten
 
 Re: Thumbnails erstellen
Autor: Dieter Zornow (---.revip2.asianet.co.th)
Datum:   21.05.10 21:50

Ja der Workaround ist entweder die Funktionen mit z.B.
DEF CreateStreamOnHGlobal(3) ! "OLE32","CreateStreamOnHGlobal" vorher definieren,
oder mit External aufrufen. Welche Funktion zu welcher DLL gehört, findest du über Google
bei MSDN



Beitrag beantworten
 
 Re: Thumbnails erstellen
Autor: Marco Lenz (---.adsl.alicedsl.de)
Datum:   22.05.10 08:57

Ah danke, ich hab mich dann doch an den Originalcode von Andreas Miethe gehalten (gdiplus). Der funktioniert super mit der Profan10 Version, und die Performance ist auch gut.

http://www.ampsoft.eu/xprofan/data/gdiplusdemo.zip

Marco

Reden ist Schweigen, Silber ist Gold !!!!

Beitrag beantworten
 Foren-Liste  |  Baumstruktur   Neuerer Beitrag  |  Älteres Thema 


 Foren-Liste  |  Zur Registrierung 
 Benutzerlogin
 Benutzername:
 Passwort:
 Login-Daten speichern:
   
 Passwort vergessen?
E-Mail-Adresse oder Username unten eingeben. Dann wird Dir per e-Mail ein neues Passwort zugeschickt.

phorum.org