Français
Forum

GDI+

 

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




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éparation
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 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
 
02.02.2009  
 




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
 
03.02.2009  
 




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


1 kB
Hochgeladen:03.02.2009
Downloadcounter137
Download
 
03.02.2009  
 




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




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éparation
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&
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
 
04.02.2009  
 




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
 
04.02.2009  
 




répondre


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

19.239 Views

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

Themeninformationen



Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie