Deutsch
Forum

GDI+

 
- Seite 1 -



Georg
Hovenbitzer
Hallo zusammen,

mich erdrückt gerade eine riesige Wissenslücke und ich hoffe ihr könnt mir weiterhelfen.
Ziel ist es, ein Bild zu laden, es zu einem Thumbnail zu verkleiner und dann in einer Datenbank abzulegen.
Mein Problem ist nun der Teil zwischen Thumbnail und Datenbank und da der, wie ich an eine Speicheradresse / Array des Bildes und dessen Größe komme:
Als Vorlage habe ich das geile GDI+ Demo von Andreas genommen.
 $H \windows.ph
 $H \includes\Functions_GDIPLUS.ph
 $H \includes\GDIP_Imageging.ph
 $I \includes\GDIP_Helper.inc
Declare gdiplusToken&,ImageObject&,ImageWidth&,ImageHeight&,GraphicObject&
Declare hPic&
Declare imgThumb&
Declare lngImage&
Declare hBitmap&
Window 0,0-1024,786
Cls ~GetSysColor(~COLOR_3DFACE)
gdiplusToken& = InitGDIPlus()
hPic& = @Create(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 ich nun etwas, was mir eine Adresse oder Array und 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  
 



 
- Seite 2 -



Georg
Hovenbitzer
Hallo Pascal,

ich habe doch gesagt, das ist eine interessante Möglichkeit
Zu deiner Frage ob es Grenzen gibt, hier der original Text von der SQLite Homepage:


Supports terabyte-sized databases and gigabyte-sized strings and blobs.


Da hat man eher ein Problem mit Plattenplatz, als mit dem was man in die Blobs verstauen will.
Ein Nachteil hat die DLL sie kann nicht verschlüsseln, was aber mal wieder mit den Exportgesetze zusammen hängen dürfte.
Aber ich habe schon eine Seite gefunden die eine Verschlüsselung im Quellcode eingebaut ist und man sich die DLL neu Compilieren muss.


Nach Aufruf von SaveJpgToMem  findet sich der vollständige Code der neu erstellten JPG in PicData#.
Sicher noch verbesserungsfähig,aber damit könnte man schon was anfangen..


Es klappt, es klappt
Ich sehe keine nötigen Verbesserung, da es genau den Weg geht wie das VB Demo.
Der ausgiebige Test kommt morgen und darauf freue ich mich schon.

Super vielen Dank !!
 
Viele Grüsse, Georg Hovenbitzer(Windows XP Pro, XProfan 11.2, Profan2Cpp 1.6a)
04.02.2009  
 




Uwe
''Pascal''
Niemeier
Hi Leute!

Georg
Ich sehe keine nötigen Verbesserung, da es genau den Weg geht wie das VB Demo.


Das kann ich nicht auf mir sitzen lassen

Hier eine verbesserte Version, bei der insgesamt nur ein Stream verwendet wird, der auch zur Rüchverwandlung Daten > Bild  herhält und am Programmende auch korrekterweise wieder entfernt wird.
Also quasi ein Rundum-Sorglos-Paket, das nebenbei auch eine praktische Funktion hat; es läßt sich als Vorschau für verschieden Kompressionsraten bei JPG verwenden
KompilierenMarkierenSeparieren
window 0,0-600,500
 $H windows.ph
--GDIPlus-Erweiterungen von Andreas Miethe
 $H Functions_GDIPLUS.ph
 $H GDIP_Imageging.ph
 $I GDIP_Helper.inc
--Funktionen aus shlwapi.dll unter XP (SP3) nur indirekt per Ordinal erreichbar
var shlwapi&=~GetModulehandle(shlwapi.dll)
var SHCreateMemStream&=~GetProcAddress(shlwapi&,12)
var IStream_Write&=~GetProcAddress(shlwapi&,212)
var IStream_Reset&=~GetProcAddress(shlwapi&,213)
var IStream_Size&= ~GetProcAddress(shlwapi&,214)
var IStream_Read&= ~GetProcAddress(shlwapi&,184)

proc StreamRelease-------------------------------------StreamRelease

    var VTable&=long(IStream&,0 )
    var Method&=long(VTable&,8 )
    call(Method&,IStream&)
    endproc-------------------------------------------------------------

    proc StreamToMem-----------------------------------------StreamToMem

        declare Size&
        call(IStream_Size&,IStream&,addr(Size&))
        dim PicData#,Size&
        call(IStream_Reset&,IStream&)
        call(IStream_Read&,IStream&,PicData#,Size&)
        endproc-------------------------------------------------------------

        proc MemToStream-----------------------------------------MemToStream

            call(IStream_Reset&,IStream&)
            call(IStream_Write&,IStream&,PicData#,sizeof(PicData#))
            endproc-------------------------------------------------------------

            Proc SaveJpgToStream---------------------------------SaveJpgToStream

                --Modifizierte Variante der SaveAsJPG-Prozedur von Andreas Miethe
                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#)

                    call(IStream_Reset&,IStream&)
                    ~GdipSaveImageToStream(Bitmap&,IStream&,encoderCLSID#,encoderParameters#)
                    result& = 1

                Endif

                Dispose encoder#
                Dispose encoderParameters#
                Dispose encoderCLSID#
                Return result&
                EndProc-------------------------------------------------------------
                external(ole32,CoInitialize,0)--OLE initialisieren
                var Token&=InitGDIPlus()------------GDI+ initialisieren
                usermessages 16---------------------WM_CLOSE abfangen
                declare PicData#,IStream&--PicData# und IStream& global deklariert!
                IStream&=call(SHCreateMemStream&,0,0)--Stream erzeugen
                var Pic&=create(hPic,-1,C:1TestBild.jpg)--Demo-Bild (Pfad anpassen!)
                declare Image&,Thumb&
                ~GdipCreateBitmapFromHBITMAP(Pic&,0,addr(Image&))--------Image von Bitmap
                ~GdipGetImageThumbnail(Image&,250,250,addr(Thumb&),0,0)--Thumb von Image (Größe 250*250)
                ~GdipDisposeImage(Image&)--------------------------------Image freigeben
                deleteobject Pic&----------------------------------------Bitmap freigeben
                SaveJpgToStream(Thumb&,5)----Thumb als JPG (schlechte Qualität) nach IStream&
                StreamToMem()----------------JPG-Daten von IStream& nach PicData#
                var LoQuality$=char$(PicData#,0,sizeof(PicData#))--PicData# als String zwischenspeichern
                SaveJpgToStream(Thumb&,100)--Thumb als JPG (gute Qualität) nach IStream&
                StreamToMem()----------------JPG-Daten von IStream& nach PicData#
                var HiQuality$=char$(PicData#,0,sizeof(PicData#))--PicData# als String zwischenspeichern
                declare Handle&,Bmp&
                char PicData#,0=LoQuality$--Daten aus String nach PicData#
                MemToStream()---------------Daten von PicData# nach IStream&
                ~GdipLoadImageFromStream(IStream&,addr(Handle&))----Image aus IStream&
                ~GdipCreateHBITMAPFromBitmap(Handle&,addr(Bmp&),0)--Bitmap aus Image
                ~GdipDisposeImage(Handle&)--------------------------Image freigeben
                drawpic Bmp&,10,10;0--------------------------------Bitmap anzeigen
                deleteobject Bmp&-----------------------------------Bitmap freigeben
                char PicData#,0=HiQuality$--Daten aus String nach PicData#
                MemToStream()---------------Daten von PicData# nach IStream&
                ~GdipLoadImageFromStream(IStream&,addr(Handle&))----Image aus IStream&
                ~GdipCreateHBITMAPFromBitmap(Handle&,addr(Bmp&),0)--Bitmap aus Image
                ~GdipDisposeImage(Handle&)--------------------------Image freigeben
                drawpic Bmp&,270,10;0-------------------------------Bitmap anzeigen
                deleteobject Bmp&-----------------------------------Bitmap freigeben

                while 1

                    waitinput
                    case %umessage=16:break

                endwhile

                StreamRelease()---------------------Stream freigeben
                external(ole32,CoUninitialize)--OLE aus
                ExitGDIPlus(Token&)-----------------GDI+ aus

PS: Die Frage nach der maximalen Datenlänge bezog sich eigendlich auf die @Decode64() -Funktion, weil iF das so betonte. Damit ließe sich JPG in DB nämlich auch für konventionelle DBs (Memo-Felder oder so) nutzen.

SeeYou
Pascal
 
06.02.2009  
 



In diesem Beispiel werden korrekt 10MB zu 13MB zu 10MB konvertiert per encode64 und decode64.
KompilierenMarkierenSeparieren
cls
long l=1024*1024
string s=mkstr$(0123456789,l)
print len(s)/1024/1024,MB
s=encode64(s)
print len(s)/1024/1024,MB
s=decode64(s)
print len(s)/1024/1024,MB
print mid$(s,1,20)
print mid$(s,len(s)-19,20)
waitkey
end

KompilierenMarkierenSeparieren
CLS
var L&=1024*1024
var S$=MKSTR$(0123456789,L&)
PRINT LEN(S$)/1024/1024,MB
S$=ENCODE64(S$)
PRINT LEN(S$)/1024/1024,MB
S$=DECODE64(S$)
PRINT LEN(S$)/1024/1024,MB
PRINT MID$(S$,1,20)
PRINT MID$(S$,LEN(S$)-19,20)
WAITKEY

1.025 kB
Hochgeladen:06.02.2009
Ladeanzahl84
Herunterladen
 
06.02.2009  
 



Wollte mal von meiner Bmp-Datei(64x64Pixel) die RGB-Werte auslesen. Das Bild hat 3 verschiedene waagerechte
Farbstreifen(RGB). Es kommen total falsche Werte 31 0 31, 227 0 227 usw.

Obwohl reine RGB-Werte kommen sollen 255 0 0, 0 255 0, 0 0 255 zb.
window 30,30-500,500
 $H Windows.ph
declare bmi#,b#
declare Pic$,Handle&,Neu&,wert&,hwin&
Window 20,20-200,200
hWin& = Create(Window, %hWnd, Test, 250, 20, 650,500)
Pic$=test.bmp
Handle&=create(hPic,-1,Pic$)
struct bmpHEADER=Size&,Width&,Height&,Planes%,BitCount%,Compression&,SizeImage&,X#(24)
dim bmi#,bmpHEADER
bmi#.Size&=sizeof(bmi#)------------------Größe von BITMAPINFOHEADER
~GetDIBits(%hdc,Handle&,0,0,0,bmi#,0)--Dummy-Aufruf, um bmpHeader zu füllen (Rückgabe: 1=OK)
print sizeof(bmi#)
dim b#,bmi#.SizeImage&-----------------Bereich für Bildinformationen (Pixel) bereitstellen
~GetDIBits(%hdc,Handle&,0,bmi#.Height&,b#,bmi#,0)--Eigendliche Bilddaten aus Handle ermitteln
Neu&=~CreateDIBitmap(%hdc,bmi#,4,b#,bmi#,0)------Neue DIB mit geänderten Farben erzeugen
startpaint hwin&
drawpic Neu&,10,10;0
endpaint
wert&=bmi#.SizeImage&

whileloop 0,wert&,4

    print byte(b#,&loop),byte(b#,&loop+1),byte(b#,&loop+2)
    sleep 10

endwhile

 
05.03.2009  
 




Jörg
Sellmeyer
Hast Du denn die Bitmap schon mit einem externen Programm überprüft? Wenn ich einfarbige Bitmaps einsetze, werden die Werte korrekt ausgegeben.
Hier ist meine Bitmap


15 kB
Hochgeladen:05.03.2009
Ladeanzahl174
Herunterladen
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
05.03.2009  
 



Die Werte habe ich bei mir überprüft, haben alle den Wert 255 in R, G und B.
Mit 2 Grafikprogrammen : Paintshop und Micrografx.

mfg
 
05.03.2009  
 



Bei mir nicht.
Zuerst kommt zwar 0 248 0 8x dann wieder 224 7 224 8x und 31 0 31 8x das bis zum schluss.

Zeig mal deine Ausleseprogramm.

mfg
 
05.03.2009  
 



Wohlbemerkt die Werte imho nicht im Format RGB sondern BGR vorliegen.
 
05.03.2009  
 



das spielt jetzt im Test keine Rolle, derweil jede Farbe den Wert 255 einzeln hat. Zumindest muss das eigentlich mit einer kleinen Schwankung seperat rauskommen und nicht diese Ausgabe oben. Vielleicht ist auch meine Aufrufreihenfolge falsch...

mfg
 
05.03.2009  
 




Jörg
Sellmeyer
Peter Bierbachh
Bei mir nicht.
Zuerst kommt zwar 0 248 0 8x dann wieder 224 7 224 8x und 31 0 31 8x das bis zum schluss.

Zeig mal deine Ausleseprogramm.

mfg


Welches Ausleseprogramm? Ich habs mit Deinem Code ausgelesen.
Die Bitmap ist mit CorelDraw erstellt.
Zeig doch mal Deine Bitmap.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
05.03.2009  
 



Im Anhang sind die Bitmap.

mfg

15 kB
Hochgeladen:05.03.2009
Ladeanzahl172
Herunterladen
15 kB
Hochgeladen:05.03.2009
Ladeanzahl155
Herunterladen
 
05.03.2009  
 




E.T.
Eben (wegen noch-nicht-schlafen-können ) mal probiert:
Test1 und Test2.bmp zeigen bei mir jeweils 255 (Rest 0) für die jeweilige Farbe an (Photoshop und AutoCad). Ebenso die bmp von Jörg.

Die im o.g. Quellcode verwendete Test.bmp ist wohl nicht dabei oder hat beim hochladen den Name geändert ??
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
06.03.2009  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

19.200 Betrachtungen

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

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie