Forum | | | | - 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 KompilierenMarkierenSeparierenwindow 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 |
| | | | |
| | |
| | | | |
| | | 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
|
| | | | |
| | 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
|
| | | 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 |
| | | | |
| | | 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 |
| | | | |
| | | Wohlbemerkt die Werte imho nicht im Format RGB sondern BGR vorliegen. |
| | | | |
| | | 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 |
| | | | |
| | 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 |
| | | | |
| | 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 ▲ |
| |
|
AntwortenThemenoptionen | 19.200 Betrachtungen |
ThemeninformationenDieses Thema hat 7 Teilnehmer: |