Forum | | | | Georg Hovenbitzer | allô zusammen,
mich erdrückt justement une riesige Wissenslücke et je hoffe vous pouvez mir weiterhelfen. but ist es, un Bild trop magasin, es trop einem Thumbnail trop verkleiner et ensuite dans einer banque de données abzulegen. mon Problem ist eh bien qui partie entre Thumbnail et banque de données et là qui, comment je à une Speicheradresse / Array des Bildes et dessen Taille viens: comme Présentation habe je cela geile GDI+ Demo de Andreas pris.
$H \windows.ph
$H \includes\Functions_GDIPLUS.ph
$H \includes\GDIP_Imageging.ph
$I \includes\GDIP_Helper.inc
Déclarer gdiplusToken&,ImageObject&,ImageWidth&,ImageHeight&,GraphicObject&
Déclarer hPic&
Déclarer imgThumb&
Déclarer lngImage&
Déclarer hBitmap&
Fenêtre 0,0-1024,786
Cls ~GetSysColor(~COLOR_3DFACE)
gdiplusToken& = InitGDIPlus()
hPic& = @Créer(hPic,-1,Bild.jpg)
~GdipCreateBitmapFromHBITMAP(hPic&,0,@Addr(lngImage&))
~GdipGetImageThumbnail(lngImage&,92,69,@Addr(imgThumb&),0,0)
~GdipCreateHBITMAPFromBitmap(imgThumb&,@Addr(hBitmap&))
DrawPic hBitmap&,50,50;0
ici bräuchte je eh bien quelque chose, quoi mir une Adresse ou bien Array et dessen Taille ermittelt !!!
WaitInput
DeleteObject hPic&
DeleteObject hBitmap&
~GdipDisposeImage(imgThumb&)
~GdipDisposeImage(lngImage&)
ExitGDIPlus(gdiplusToken&)
Fin
|
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.02.2009 ▲ |
| |
| | | je crois ici [...] ./. ici [...] steht qui Solution.
je serait wohl qui Thumbs per XProfan11s hPic-Funktionen erzeugen, et qui paire Pixel des Thumbs per z.B. inlineasm ou bien ner kleinen DLL abpixeln, si qui DIB-Krahm pas veux. *g* |
| | | | |
| | Georg Hovenbitzer | allô si,
merci pour qui à gauche, werde vous mir juste la fois genauer regarder. avec XProfan11 erzeugte Thumbnails sommes de qui la qualité pas qui Hit, là muss on ensuite d'abord encore la fois une Weichzeichner drüber courir laisser, aucun saubere Solution. Per GDI+ pourrait je vous zur Zeit déjà abspeichern et ensuite simple wieder récente einlesen et dans qui banque de données Sauver. mais je serait es volontiers créer sans cette le détour, rein um quoi trop apprendre. la fois voyons peut-être viens je avec den à gauche oui bien sûr ou bien es hat quelqu'un encore une Tip!
Nachtrag: j'ai mir beide Demos la fois angesehen, malheureusement aider vous Je ne plus. malheureusement viens je à aucun brauchbare Adresse et dessen Taille um per BlockWrite den grenier wegzuschreiben. |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.02.2009 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | Hi Georg!
Habe ici une vieille Routine trouvé et sur qui Schnelle angepaßt; avec cela läßt sich un bmp-Handle dans Bilddaten décomposer. peut-être hilf cela quoi: KompilierenMarqueSéparationwindow 30,30-500,500
$H Windows.ph
declare a#,b#
declare Pic$,Handle&,Neu&
---------------------------------Diesen Pfad bitte anpassen!
Pic$=C:Dokumente und EinstellungenPascalDesktopBild.jpg
Handle&=create(hPic,-1,Pic$)--Liefert immer 32-Bit-Handle!
--BITMAPINFOHEADER-Struktur
--Nur benötigte Parameter wurden bezeichnet
struct bmpHEADER=Size&,Width&,Height&,Planes%,BitCount%,Compression&,SizeImage&,X#(24)
dim a#,bmpHEADER
a#.Size&=sizeof(a#)------------------Größe von BITMAPINFOHEADER
~GetDIBits(%hdc,Handle&,0,0,0,a#,0)--Dummy-Aufruf, um bmpHeader zu füllen (Rückgabe: 1=OK)
dim b#,a#.SizeImage&-----------------Bereich für Bildinformationen (Pixel) bereitstellen
~GetDIBits(%hdc,Handle&,0,a#.Height&,b#,a#,0)--Eigendliche Bilddaten aus Handle ermitteln
Neu&=~CreateDIBitmap(%hdc,a#,4,b#,a#,0)------Neue DIB mit geänderten Farben erzeugen
drawpic Neu&,10,10;0
dispose a#
dispose b#
waitkey
BTW: Que le la qualité (create(hSizedPic... ?)c'est moi encore pas aufgefallen; mais GDI+ ist deutlich plus rapide. BTW2: Kriegst du qui (binären) données car überhaupt dans qui DB? peux mich dunkel erinnern, qui manche DBs non-ASCII-données ignorer ou bien transformer.
HTH Pascal |
| | | | |
| | Georg Hovenbitzer | allô Pascal,
vielen Dank pour den Tipp. mais je viens avec cela pas entier bien sûr, j'ai zwar eh bien qui Taille des Bitmaps et un Array, mais cela wieder Abspeichern haut pas hin. dans meinem Beispiel habe je cela Handle vom erstellten Thumbnail et pourrait eh bien avec qui vom Andreas geschriebenen Funktion SaveAsJPG cela Bild aussi abspeichern. en supplément benutzt il dans seiner Funktion GdipSaveImageToFile! Es pourrait son, dass qui Funktion GdipSaveImageToStream cela richtige pour mich ist, habe mais je n'en sais rien comment on vous richtig einsetzt.
Viele Grüße Georg |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.02.2009 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | Hi Georg!
Relatif à la Sauver sollte ne...aucune Problem son - wohlgemerkt dans un Dossier! mais je ahne lente, worauf du hinauswillst: tu veux une JPG-Dossier im grenier erzeugen et qui ensuite dans qui DB insérer, richtig? (Wobei trop considérer ist, qui Bild-Handles toujours Bitmap-basé sommes)
Relatif à la Stream pourrait marcher, ist mais pas einfach; Streams sommes COM-Objekte et avec cela pas léger trop handhaben. Aussi bleibt encore qui Frage, si et comment du qui Binärdaten dans qui DB kriegst.
une Alternative wäre, qui Thumbs dans un ImageList trop saisir et cet comme une Dossier (parallèle zur DB) abzuspeichern. dans qui DB wäre ensuite seulement un index aufs Bild dans qui ImageList vermerkt. Habe je déjà erfolgreich praktiziert
peut-être verwendest du mais aussi une DB, qui de maison aus Bilder enthalten kann; ensuite devrait on qui l'affaire avec ActiveX / VBA angehen.
ou bien plan qui Trick avec dem DataGenerator
HTH Pascal |
| | | | |
| | Georg Hovenbitzer | allô Pascal,
oui c'est ca ca était mon concept, um den le détour des Mémoire dans un Dossier trop tourner autour de. j'ai viel im Internet gesucht et quoi je trouvé habe, sah alles autre comme simple aus. ca wäre un Beispiel [...] wohin un Bild am Ende dans einem Byte Array landet et de là pourrait on es dans un DB écrivons. mais alle mon Versuche es nachzubauen sommes gescheiter, là mir ici aussi cela tiefere Grundwissen fehlt. j'ai mich avec SQLite befasst et konnte là sans Probleme JPG Bilder dans Blob Felder enlever et wieder sortir. si du encore une Tipp la hâte toujours her avec cela |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 03.02.2009 ▲ |
| |
| | | Kleine Frage hierzu! Solch un z.B. 48x48 JPG 60% sollte sous 1 KB données besoin, alors aussi la cousine64-kodiert ne...aucune Problem...
alors pourquoi pas simple komplette JPG (681 Byte) magasin? var meinString$=[decode64](jpgDateiInhalt) ?
|
| | | | |
| | Thomas Freier | ah Georg, verrate uns doch einmal den Datenbanktyp: dBaseV.dbf, access.mdb avec Ole-champ ou bien HiPer-Six.dbf,FoxPro.dbf avec Blob-champ ou bien ??? qui genannten peut sûrement avec aussi sur sql bearbeitet volonté. et dans deinem Hinweis wird sur :
Pour qui Funktion PictureToString wird qui IStream.TLB de madmax nécessaire et ist dans diesem Télécharger enthalten.
verwiesen. |
| | | | |
| | Georg Hovenbitzer | allô zusammen,
und dir mir ici pas seulement tout autor qui Thumbnails dans un banque de données trop Sauver, mais aussi qui original Bilder. chez dem Original ist ca ne...aucune Problem, là je es per Blockread einlesen et so dans un Blob champ abspeichern peux. chez den Thumbnails ist es anders, là vous oui seulement erstellt volonté et daher seulement comme Bitmap im grenier vorliegen, ca muss d'abord oui encore dans un JPG Format gestreamt volonté et ensuite peux je es enlever. cela Streamen allez si je cela Bitmap avec GdipSaveImageToFile abspeichere, pour gibt es Vorlagen. il peut eh bien cela gespeicherte Thumbnail wieder Einlesen et dans qui banque de données Sauver, seulement ca serait je mir volontiers sparen, seul afin de voyons comme allez.
Anbei la fois un Demo comment on avec SQLite un bild dans un banque de données ablegt, qui benötigte DLL bekommt on chez SQLite. cela Demo legt une DB à, invite un Bild, speichert ca dans qui DB, liest es wieder aus et grenier es et une anderen Namen ab. qui Ausgaben sur dem Bildschirm sommes seulement Statusmeldungen, es volonté aussi aucun faute abgefangen. Pfade s'il te plaît anpassen. KompilierenMarqueSéparationDef ZeroMemory(2) !KERNEL32,RtlZeroMemory
Def MoveMemory(3) !KERNEL32,RtlMoveMemory
Def WriteFile(5) !KERNEL32,WriteFile
Def CreateFile(7) !KERNEL32,CreateFileA
Def ReadFile(5) !KERNEL32,ReadFile
Def OpenFile(3) !KERNEL32,OpenFile
Def GetFileSizeAPI(2) !KERNEL32,GetFileSize
Def CloseHandle(1) !KERNEL32,CloseHandle
Def &SQLITE_OK 0/* Successful result */
Def &SQLITE_ERROR 1/* SQL error or missing database */
Def &SQLITE_INTERNAL 2/* Internal logic error in SQLite */
Def &SQLITE_PERM 3/* Access permission denied */
Def &SQLITE_ABORT 4/* Callback routine requested an abort */
Def &SQLITE_BUSY 5/* The database file is locked */
Def &SQLITE_LOCKED 6/* A table in the database is locked */
Def &SQLITE_NOMEM 7/* A malloc() failed */
Def &SQLITE_READONLY 8/* Attempt to write a readonly database */
Def &SQLITE_INTERRUPT 9/* Operation terminated by sqlite3_interrupt()*/
Def &SQLITE_IOERR 10/* Some kind of disk I/O error occurred */
Def &SQLITE_CORRUPT 11/* The database disk image is malformed */
Def &SQLITE_NOTFOUND 12/* NOT USED. Table or record not found */
Def &SQLITE_FULL 13/* Insertion failed because database is full */
Def &SQLITE_CANTOPEN 14/* Unable to open the database file */
Def &SQLITE_PROTOCOL 15/* NOT USED. Database lock protocol error */
Def &SQLITE_EMPTY 16/* Database is empty */
Def &SQLITE_SCHEMA 17/* The database schema changed */
Def &SQLITE_TOOBIG 18/* String or BLOB exceeds size limit */
Def &SQLITE_CONSTRAINT 19/* Abort due to constraint violation */
Def &SQLITE_MISMATCH 20/* Data type mismatch */
Def &SQLITE_MISUSE 21/* Library used incorrectly */
Def &SQLITE_NOLFS 22/* Uses OS features not supported on host */
Def &SQLITE_AUTH 23/* Authorization denied */
Def &SQLITE_FORMAT 24/* Auxiliary database format error */
Def &SQLITE_RANGE 25/* 2nd parameter to sqlite3_bind out of range */
Def &SQLITE_NOTADB 26/* File opened that is not a database file */
Def &SQLITE_ROW 100/* sqlite3_step() has another row ready */
Def &SQLITE_DONE 101/* sqlite3_step() has finished executing */
Def &SQLITE_OPEN_READONLY $00000001
Def &SQLITE_OPEN_READWRITE $00000002
Def &SQLITE_OPEN_CREATE $00000004
Def &SQLITE_OPEN_DELETEONCLOSE $00000008
Def &SQLITE_OPEN_EXCLUSIVE $00000010
Def &SQLITE_OPEN_MAIN_DB $00000100
Def &SQLITE_OPEN_TEMP_DB $00000200
Def &SQLITE_OPEN_TRANSIENT_DB $00000400
Def &SQLITE_OPEN_MAIN_JOURNAL $00000800
Def &SQLITE_OPEN_TEMP_JOURNAL $00001000
Def &SQLITE_OPEN_SUBJOURNAL $00002000
Def &SQLITE_OPEN_MASTER_JOURNAL $00004000
Def &SQLITE_OPEN_NOMUTEX $00008000
Def &SQLITE_OPEN_FULLMUTEX $00010000
Def &SQLITE_STATIC 0
Def &SQLITE_TRANSIENT -1
Declare Datei$
Declare hDLL&
Declare dll$
Declare DBName$
Declare hDB&
Declare Error&
Declare SQLCmd$
Declare Result&
Declare Titel$[]
Declare Titel$
Declare Titel&
Declare zKey$
Declare zBlob#
Declare nBlob&
Declare pnBlob&
Declare pzBlob#
Declare BWrite&
Declare FBuf#
Declare FHdl&
Declare FSize&
Window 0,0-1024,786
@Set(CallConv,CDECL)
dll$ = \sqlite3.dll
hDLL& = ImportDLL(dll$,_)
DBName$ = \TestDB3.db3
Print ---------
Error& = _sqlite3_open_v2(@Addr(DBName$),@Addr(hDB&),(&SQLITE_OPEN_READWRITE | &SQLITE_OPEN_CREATE),0)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
SQLCmd$ = CREATE TABLE blobs(key TEXT PRIMARY KEY, value BLOB);
Error& = _sqlite3_exec(hDB&,@Addr(SQLCmd$),0,0,@Addr(Result&))
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
SQLCmd$ = INSERT INTO blobs(key, value) VALUES(?, ?);
Error& = _sqlite3_prepare_v2(hDB&,@Addr(SQLCmd$),-1,@Addr(Result&),0)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
zKey$ = Bild
_sqlite3_bind_text(Result&,1,@Addr(zKey$),-1,&SQLITE_STATIC)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
Datei$ = \Wasserlilien.jpg
Dim zBlob#,@FileSize(Datei$)
nBlob& = @BlockRead(Datei$,zBlob#,0,@FileSize(Datei$))
_sqlite3_bind_blob(Result&,2,zBlob#,@FileSize(Datei$),&SQLITE_TRANSIENT)
Print @String$(_sqlite3_errmsg(hDB&),0)
Dispose zBlob#
Print ---------
_sqlite3_step(Result&)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
_sqlite3_finalize(Result&)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
SQLCmd$ = SELECT value FROM blobs WHERE key = ?;
Error& = _sqlite3_prepare_v2(hDB&,@Addr(SQLCmd$),-1,@Addr(Result&),0)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
zKey$ = Bild
_sqlite3_bind_text(Result&,1,@Addr(zKey$),-1,&SQLITE_STATIC)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
_sqlite3_step(Result&)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
pnBlob& = _sqlite3_column_bytes(Result&,0)
Datei$ = \Blob_Wasserlilien.jpg
Dim FBuf#,1024
String FBuf#,0 = Datei$ + @Chr$(0)
FHdl& = CreateFile(FBuf#,$40000000,0,0,$4,$80,0)
WriteFile(FHdl&,_sqlite3_column_blob(Result&,0),pnBlob&,@Addr(BWrite&),0)
CloseHandle(FHdl&)
Dispose FBuf#
Print ---------
_sqlite3_finalize(Result&)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
Error& = _sqlite3_close(hDB&)
Print @String$(_sqlite3_errmsg(hDB&),0)
Print ---------
WaitInput
../../funktionsreferenzen/XProfan/freedll/'>FreeDLL hDLL&
Fin
|
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 04.02.2009 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | Hi Georg!
L'idée commence à, mir trop plaisons... Que le ImageList ou bien bmp-données dans Bereichsvariablen ist zwar einfacher, mais là venons vite un paire MB zusammen (sans Original-Bilder!).
cela VB-Beispiel pourrait là nützlich son...
iF
Solch un z.B. 48x48 JPG 60% sollte sous 1 KB données besoin, alors aussi la cousine64-kodiert ne...aucune Problem...
Gibt es là une frontière, quoi qui Datenlänge betrifft?
SeeYou Pascal |
| | | | |
| | Uwe ''Pascal'' Niemeier | je nochmal
Aus deinem Beispiel et dem Code de Andreas habe je la fois vite ca gebastelt: KompilierenMarqueSéparation $H windows.ph
$H Functions_GDIPLUS.ph
$H GDIP_Imageging.ph
$I GDIP_Helper.inc
---Für Header:
CoInitialize(=External(ole32,CoInitialize,;
CoUninitialize(=External(ole32,CoUninitialize,;
CreateStreamOnHGlobal(=External(ole32,CreateStreamOnHGlobal,;
GetHGlobalFromStream(=External(ole32,GetHGlobalFromStream,;
def CoInitialize(1) !ole32,CoInitialize
def CoUninitialize(0) !ole32,CoUninitialize
def CreateStreamOnHGlobal(3) !ole32,CreateStreamOnHGlobal
def GetHGlobalFromStream(2) !ole32,GetHGlobalFromStream
Proc SaveJpgToMem---------------------------------------SaveJpgToMem
Parameters Bitmap&,Quality&
Declare encoderCLSID#,result&
result& = 0
Dim encoderCLSID#,16
Declare encoderParameters#
Declare wTemp$,encoder#
wTemp$ = S2WS(~EncoderQuality)
Dim encoder#,16
IIDFromString(ADDR(wTemp$),encoder#)
Dim encoderParameters#,32
Long encoderParameters#,0 = 1
MoveMemory(encoderParameters#+4,encoder#,16)
Long encoderParameters#,20 = 1
Long encoderParameters#,24 = ~EncoderParameterValueTypeLong
Long encoderParameters#,28 = ADDR(Quality&)
If GetEncoderCLSID(image/jpeg,encoderCLSID#)
--Original: ~GdipSaveImageToFile(Bitmap&,ADDR(newFile$),encoderCLSID#,encoderParameters#)
CoInitialize(0)--------------------------------------------------
declare IStream&
CreateStreamOnHGlobal(0,1,addr(IStream&))
~GdipSaveImageToStream(Bitmap&,IStream&,encoderCLSID#,encoderParameters#)
declare Global&,Mem&,Size&
GetHGlobalFromStream(IStream&,addr(Global&))
Mem&=~GlobalLock(Global&)
Size&=~GlobalSize(Global&)
dim PicData#,Size&---------------PicData# global deklariert
MoveMemory(PicData#,Mem&,Size&)--MoveMemory definiert in GDIP_Helper.inc
~GlobalUnlock(Global&)
~GlobalFree(Global&)
CoUninitialize()-------------------------------------------------
result& = 1
Endif
Dispose encoder#
Dispose encoderParameters#
Dispose encoderCLSID#
Return result&
EndProc-------------------------------------------------------------
Declare gdiplusToken&,ImageObject&,ImageWidth&,ImageHeight&,GraphicObject&
Declare hPic&
Declare imgThumb&
Declare lngImage&
Declare hBitmap&
Window 0,0-500,500
gdiplusToken& = InitGDIPlus()
hPic&=create(hPic,-1,C:1TestBild.jpg)-----------------------Pfad anpassen!
~GdipCreateBitmapFromHBITMAP(hPic&,0,addr(lngImage&))
~GdipGetImageThumbnail(lngImage&,120,120,addr(imgThumb&),0,0)
~GdipCreateHBITMAPFromBitmap(imgThumb&,addr(hBitmap&),0)--Drei Parameter!!
DrawPic hBitmap&,50,50;0
declare PicData#--wird vor Ort jeweils passend dimensioniert
SaveJpgToMem(imgThumb&,75)
-----------------------------Test
assign #1,C:1TestTest.jpg
openrw #1
blockwrite #1,PicData#,0,sizeof(PicData#)
close #1
WaitInput
DeleteObject hPic&
DeleteObject hBitmap&
~GdipDisposeImage(imgThumb&)
~GdipDisposeImage(lngImage&)
ExitGDIPlus(gdiplusToken&pan>
Fin
Pour Aufruf de SaveJpgToMem findet sich qui vollständige Code qui récente erstellten JPG dans PicData#. sûrement encore verbesserungsfähig,mais avec cela pourrait on déjà quoi anfangen...
HTH Pascal |
| | | | |
|
répondreOptions du sujet | 19.406 Views |
Themeninformationencet Thema hat 7 participant: |