Foro | | | | Georg Hovenbitzer | ¡Hola zusammen,
mich erdrückt gerade una riesige Wissenslücke y yo hoffe ihr könnt me weiterhelfen. Ziel es, una Bild a invitar, lo a una Thumbnail a verkleiner y luego en uno Datenbank abzulegen. Mein Problema es nun el Teil zwischen Thumbnail y Datenbank y como el, Yo a una Speicheradresse / Array des Bildes y dessen Größe komme: Als Presentación Yo el geile GDI+ Demo de Andreas genommen.
$H \windows.ph
$H \includes\Functions_GDIPLUS.ph
$H \includes\GDIP_Imageging.ph
$I \includes\GDIP_Helper.inc
Declarar gdiplusToken&,ImageObject&,ImageWidth&,ImageHeight&,GraphicObject&
Declarar hPic&
Declarar imgThumb&
Declarar lngImage&
Declarar hBitmap&
Ventana 0,0-1024,786
Cls ~GetSysColor(~COLOR_3DFACE)
gdiplusToken& = InitGDIPlus()
hPic& = @Crear(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
hier bräuchte Yo nun algo, qué me una Adresse oder Array y dessen Größe ermittelt !!!
WaitInput
DeleteObject hPic&
DeleteObject hBitmap&
~GdipDisposeImage(imgThumb&)
~GdipDisposeImage(lngImage&)
ExitGDIPlus(gdiplusToken&)
End
|
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.02.2009 ▲ |
| |
| | | Yo glaube hier [...] ./. hier [...] es el Solución.
Yo sería wohl el Thumbs por XProfan11s hPic-Características erzeugen, y el pocos Pixel des Thumbs por z.B. inlineasm oder ner pequeño DLL abpixeln, si la DIB-Krahm no voluntad. *g* |
| | | | |
| | Georg Hovenbitzer | ¡Hola if,
danke para el Links, voluntad ellos me igual veces genauer ansehen. Mit XProfan11 erzeugte Thumbnails son de el Qualität no Hit, como muss una continuación zuerst una vez más una Weichzeichner drüber laufen dejar, no saubere Solución. Per GDI+ podría Yo ellos a Tiempo ya abspeichern y luego simplemente otra vez neu einlesen y el Datenbank speichern. Aber Yo sería lo gerne schaffen sin esta Umweg, rein en qué a aprender. Tiempo sehen tal vez komme Puedo usar el Links sí klar oder lo ha alguien todavía una Tip!
Apéndice: Yo habe me beide Demos veces angesehen, desafortunadamente helfen ellos No más. Leider komme Yo a no brauchbare Adresse y dessen Größe en por BlockWrite el Speicher wegzuschreiben. |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 02.02.2009 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | Hi Georg!
Posesiones hier una alte Rutina gefunden y en el Schnelle angepaßt; así läßt se una bmp-Handle en Bilddaten zerlegen. Tal vez hilf el qué: KompilierenMarcaSeparaciónwindow 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 el Qualität (create(hSizedPic... ?)me está todavía no aufgefallen; aber GDI+ es deutlich más rápido. BTW2: Kriegst du el (binären) Daten porque überhaupt en el DB? Kann mich dunkel erinnern, daß manche DBs non-ASCII-Daten ignorieren oder umwandeln.
HTH Pascal |
| | | | |
| | Georg Hovenbitzer | ¡Hola Pascal,
vielen Dank para el Tipp. Aber Yo vengo así no bastante klar, Yo zwar nun el Größe des Bitmaps y una Array, aber el otra vez Abspeichern haut no hin. In mi Ejemplo Yo el Handle vom erstellten Thumbnail y podría nun con el vom Andreas geschriebenen Función SaveAsJPG el Bild auch abspeichern. Dazu benutzt él en su Función GdipSaveImageToFile! Lo podría ser, dass el Función GdipSaveImageToStream el richtige para mich es, habe pero no Idea cómo ellos correcto 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!
Relacionado con la Guardar debería kein Problema ser - wohlgemerkt en un Expediente! Aber Yo ahne langsam, worauf du hinauswillst: Usted willst una JPG-Expediente en el Speicher erzeugen y el entonces en el DB einfügen, correcto? (Wobei a bedenken es, daß Bild-Handles siempre Mapa de bits-basiert son)
Relacionado con la Stream podría klappen, es pero no einfach; Streams son COM-Objetos y así no ligeramente a handhaben. Außerdem restos todavía el Cuestión, si y cómo du el Binärdaten en el DB kriegst.
Un Alternative wäre, el Thumbs en un ImageList a packen y esta como una Expediente (parallel a DB) abzuspeichern. In el DB wäre entonces sólo una Index aufs Bild en el ImageList vermerkt. Posesiones Yo ya erfolgreich praktiziert
Tal vez verwendest du aber auch una DB, el de Haus de Bilder enthalten kann; entonces müßte uno el Sache con ActiveX / VBA angehen.
Oder eben el Trick con el DataGenerator
HTH Pascal |
| | | | |
| | Georg Hovenbitzer | ¡Hola Pascal,
genau dies war mi Concepto, en el Umweg des Speichers en un Expediente a umgehen. Yo habe viel Internet gesucht y Yo gefunden habe, sah alles otro como simplemente de. Dies wäre una Ejemplo [...] wo una Bild al Ende en un Byte Array landet y de como podría uno lo en un DB escribir. aber todos mi Versuche lo nachzubauen son gescheiter, como me hier auch el tiefere Grundwissen fehlt. Yo habe mich con SQLite befasst y podría hay sin Problemas JPG Bilder en Blob Felder ablegen y otra vez herausholen. Wenn du todavía una Tipp hast siempre her así |
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 03.02.2009 ▲ |
| |
| | | Kleine Cuestión hierzu! Solch una z.B. 48x48 JPG 60% debería bajo 1 KB Daten benötigen, also auch base64-kodiert kein Problema...
Also por qué no simplemente komplette JPG (681 Byte) Laden? var meinString$=[decode64](jpgDateiInhalt) ?
|
| | | | |
| | Thomas Freier | Ach Georg, verrate uns doch una vez el Datenbanktyp: dBaseV.dbf, access.mdb con Ole-Feld oder HiPer-Six.dbf,FoxPro.dbf con Blob-Feld oder ??? El genannten puede sicher con auch encima sql bearbeitet voluntad. Und en deinem Referencia se en :
Für el Función PictureToString se el IStream.TLB de madmax benötigt y es en diesem Descargar enthalten.
verwiesen. |
| | | | |
| | Georg Hovenbitzer | ¡Hola zusammen,
lo va me hier no sólo por lo tanto la Thumbnails en un Datenbank a speichern, pero auch el original Bilder. En el Original es dies kein Problema, como Yo por Blockread einlesen y así en una Blob Feld abspeichern kann. En el Thumbnails es anders, como ellos sí sólo erstellt y ser por lo tanto sólo como Mapa de bits en el Speicher vorliegen, dies muss zuerst sí aún en una JPG Formato gestreamt y ser entonces kann Yo ablegen. Das Streamen va si yo el Mapa de bits con GdipSaveImageToFile abspeichere, dafür hay Vorlagen. Se puede nun el gespeicherte Thumbnail otra vez Einlesen y el Datenbank speichern, sólo dies sería Yo gerne sparen, allein en a sehen como va.
Anbei veces una Demo cómo con SQLite una bild en un Datenbank ablegt, el benötigte DLL bekommt uno en SQLite. Das Demo legt una DB a, lädt una Bild, speichert dies en el DB, liest lo otra vez de y speicher lo y una otro Namen de. El Ausgaben en el Bildschirm son sólo Statusmeldungen, lo voluntad auch no Fehler abgefangen. Pfade Por favor, adaptar. KompilierenMarcaSeparaciónDef 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&
End
|
| | | Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a) | 04.02.2009 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | Hi Georg!
La idea fängt a, me a gefallen... Que el ImageList oder bmp-Daten en Bereichsvariablen Aunque einfacher, aber como kommen rápidamente unos pocos MB zusammen (sin Original-Bilder!).
Das VB-Ejemplo podría como nützlich ser...
IF
Solch una z.B. 48x48 JPG 60% debería bajo 1 KB Daten benötigen, also auch base64-kodiert kein Problema...
Gibt lo como una Grenze, lo que el Datenlänge betrifft?
SeeYou Pascal |
| | | | |
| | Uwe ''Pascal'' Niemeier | Yo otra vez
Aus deinem Ejemplo y el Code de Andreas Yo veces rápidamente dies gebastelt: KompilierenMarcaSeparación $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>
End
Nach Aufruf de SaveJpgToMem findet se el vollständige Code el neu erstellten JPG en PicData#. Seguro todavía verbesserungsfähig,aber así podría uno ya qué anfangen...
HTH Pascal |
| | | | |
|
RespuestaTema opciones | 19.410 Views |
ThemeninformationenDieses Thema ha 7 subscriber: |