Hallo,
ich habe die Funktion wieder zeilenweise durchlaufen lassen.
Der Rückgabewert von "CreateStreamOnHGlobal" ist 0, der Stream wurde korrekt erzeugt.
Ich habe jetzt mal anstelle von BMP den Typ GIF eingesetzt.
Damit funktioniert die Umwandlung.
Ebenso mit Typ JPG !
Bei PNG kommt aber wieder der bekannte Fehler.
Jetzt muss ich allerdings gestehen, dass ich mit dem Thema etwas überfordert bin.
Was will ich machen ?
Die Funktion soll in der Datenbank ein Thumbnail ablegen, das unkomprimiert die Bilddaten enthält.
Mit diesem Daten sollen in Übersichten schnelle Vorschaubilder erzeugt werden.
Was passiert, wenn ich hier einen anderen Typ auswähle ?
Bei "GIF" stelle ich fest, dass die Farbtiefe reduziert ist, bei JPG konnte ich noch keinen Unterschied feststellen.
Hier nochmal der Code für die anderen Leser, die das Modul nicht kennen :
'Ähnlich wie vorstehende Prozedur (s. Parameter), nur, dass hier
'nicht in eine Datei gespeichert wird, sondern eine Umwandlung
'über ein OLE-Stream-Objekt in ein Byte-Array vollzogen wird.
'! Dieser Code ist ein Novum, weil er ohne jegliche Type Library auskommt,
' den Stream über das versteckte stdole.IUnknown erzeugt
' und dabei ausschließlich OLE-API-Funktionen verwendet !
Function ArrayFromPicture(ByVal image As Picture, PicType As PicFileType, _
Optional Quality As Byte = 80) As Byte()
Dim lBitmap As Long
Dim TEncoder As GUID
Dim ret As Long
Dim TParams As EncoderParameters
Dim sType As String
Dim IStm As stdole.IUnknown
If lGDIP = 0 Then InitGDIP: If lGDIP = 0 Then Exit Function
If image Is Nothing Then Exit Function
If GdipCreateBitmapFromHBITMAP(image.handle, 0, lBitmap) = 0 Then
Select Case PicType 'CLSID des GDIP-Format-Encoders wählen:
Case pictypeBMP: sType = "{557CF400-1A04-11D3-9A73-0000F81EF32E}"
Case pictypeGIF: sType = "{557CF402-1A04-11D3-9A73-0000F81EF32E}"
Case pictypePNG: sType = "{557CF406-1A04-11D3-9A73-0000F81EF32E}"
Case pictypeJPG: sType = "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
End Select
CLSIDFromString StrPtr(sType), TEncoder
If PicType = pictypeJPG Then 'Falls JPG, dann zusätzlich als
' Parameter
'die Qualitätsstufe einstellen
TParams.count = 1
With TParams.Parameter ' Quality
CLSIDFromString StrPtr( _
"{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .UUID
.NumberOfValues = 1
.type = 4
.Value = VarPtr(Quality)
End With
Else
'Unterschied bei Parameterzahl zwischen GDI+ 1.0 und GDI+ 1.1 bei
' GIFs!!
If bIsGdip11 And (PicType = pictypeGIF) Then TParams.count = 1 Else _
TParams.count = 0
End If
ret = CreateStreamOnHGlobal(0&, 1, IStm) 'Stream erzeugen
'GDIP-Image in Stream speichern:
ret = GdipSaveImageToStream(lBitmap, IStm, TEncoder, TParams)
If ret = 0 Then
Dim hMem As Long, LSize As Long, lpMem As Long
Dim abData() As Byte
ret = GetHGlobalFromStream(IStm, hMem) 'Speicher-Handle aus
' Stream erhalten
If ret = 0 Then
LSize = GlobalSize(hMem)
lpMem = GlobalLock(hMem) 'Zugriff auf Speicher erhalten
ReDim abData(LSize - 1) 'Array entspr. dimensionieren
'Aus Speicherblock des Streams in Array übertragen:
CopyMemory abData(0), ByVal lpMem, LSize
GlobalUnlock hMem 'Speicher wieder sperren
ArrayFromPicture = abData 'Ergebnis
End If
Set IStm = Nothing 'Stream löschen
End If
GdipDisposeImage lBitmap 'GDIP-Image-Speicher freigeben
End If
End Function Ich übergebe ein StdPicture Objekt in die Funktion und bekomme ein Byte() Array zurück. Dies speichere ich dann in das Tabellenfeld.
Wozu kann ich dann überhaupt den Typ auswählen ? Muss ich den passend zum Quellbild einstellen ?
Durch die Funktion MakeThumbGDIP wurde das Quellbild aber bereits mit GDI+ überarbeitet.
Ich ging bisher davon aus, dass die Speicherung im Byte-Array als reine Bitmap ohne irgendwelchen "Firlefanz" erfolgt.
Vielleicht kannst du mir etwas auf die Sprünge helfen, damit ich die Funktionsweise besser verstehe.
Als schnelle Lösung kann jetzt natürlich auf den Typ JPG umstellen, weiß aber nicht, was ich damit eventuell anrichte.
Gruß
Benne |