Español
Foro

GDI+

 

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*
 
02.02.2009  
 




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ón
window 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
 
02.02.2009  
 




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
 
03.02.2009  
 




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) ?


1 kB
Hochgeladen:03.02.2009
Ladeanzahl137
Descargar
 
03.02.2009  
 




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.
 
Gruß Thomas
Windows XP SP2, XProfan X2
04.02.2009  
 




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ón
Def 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
 
04.02.2009  
 




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
 
04.02.2009  
 




Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

19.319 Views

Untitledvor 0 min.
Thomas Freier27.08.2019
Georg11.05.2015
Andre Rohland14.02.2015
Uwe ''Pascal'' Niemeier11.12.2014
Más...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie