vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
Mit JPG und GIF funktioniert es, warum ? 
Autor: benne
Datum: 29.09.10 17:37

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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Fehler bei GDI+ Funktionen unter WIN7-32bit4.806benne16.09.10 10:21
Re: Fehler bei GDI+ Funktionen unter WIN7-32bit3.355ModeratorMartoeng16.09.10 17:35
Re: Fehler bei GDI+ Funktionen unter WIN7-32bit3.314benne17.09.10 07:24
Fehlerposition nach Debug gefunden3.515benne17.09.10 08:12
Re: Fehlerposition nach Debug gefunden3.471ModeratorMartoeng17.09.10 14:47
Re: Fehlerposition nach Debug gefunden3.363benne17.09.10 15:14
Re: Fehlerposition nach Debug gefunden3.463ModeratorMartoeng17.09.10 15:47
Re: Fehlerposition nach Debug gefunden3.359benne20.09.10 08:16
Re: Fehlerposition nach Debug gefunden3.307ModeratorMartoeng20.09.10 12:11
Re: Fehlerposition nach Debug gefunden3.318benne21.09.10 09:47
Re: Fehlerposition nach Debug gefunden3.419ModeratorMartoeng28.09.10 13:45
Mit JPG und GIF funktioniert es, warum ?3.399benne29.09.10 17:37
Re: Mit JPG und GIF funktioniert es, warum ?3.298ModeratorMartoeng30.09.10 10:40
Re: Mit JPG und GIF funktioniert es, warum ?3.346benne30.09.10 10:45
Re: Mit JPG und GIF funktioniert es, warum ?3.290ModeratorMartoeng30.09.10 11:00

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel