So, das Palettenproblem hab ich inzwischen auch behoben mit GetDIBit API.
Meine Routine schaffte es nun in 2..6ms den tatsächlichen Grafik-Bereich eines Bildes
von 1000x1000 Pixeln zu ermitteln (also die Ränder abzuschneiden).
Jetzt noch ein völlig simples Problem.
Es funktioniert nur, wenn ich zuvor ein Bild in eine PictureBox geladen habe.
Aber leider nicht, wenn mein Inhalt im Image der PictureBox vorliegt!?
Gibt es hier irgendeinen einfachen weg,
wie den GetDC und CopyMemory Befehl auch auf das Image der PictureBox anwende
bzw das Image correct in die PictureBox.Picture lade!?
Sorry für die vermutlich einfache Frage, aber ich komm irgendwie nicht weiter.
Dies funktioniert übrigens nicht:
PictureBox.Picture = PictureBox.Image
Hier kurz der funktionierende Code für PictureBox.Picture als Quellbild:
'picSource.Picture = picSource.image 'funktioniert nicht -> pic() _
bleibt leer!!!
'RetVal = GetObject(picSource.Image, Len(bmp), bmp) 'funktioniert nicht _
-> pic() bleibt leer!!!
'so funktionierts (aber leider ist mein Bild im .Image und nicht im
' .Picture):
RetVal = GetObject(picSource.Picture, Len(bmp), bmp)
' SafeArray-Daten zur späteren Dimensionierung des Overlay-Array
' für das geladene Bild passend einrichten
' global deklarierte Variable !!
With gSafearray
.Elemente = 1
.Dimensionen = 2 ' 2-dimensionales Array
.lBound1 = 0
.Elements1 = bmp.PixelHeight ' Bildhöhe in Pixel
.lBound2 = 0
.Elements2 = bmp.BytesWidth ' Bildbreite in Byte !!!
.DatenZeiger = bmp.BitZeiger ' Zeiger auf die Bilddaten
End With
' Statt Array-Dimensionierung:
' Safearray-Daten in das Array kopieren (= Overlay erstellen)
Call CopyMemory(ByVal VarPtrArray(pic), VarPtr(gSafearray), 4)
' BackUp-Array wie gewohnt dimensionieren
ReDim gPicBackup(0 To bmp.BytesWidth - 1, 0 To bmp.PixelHeight - 1)
' Bilddaten per Overlay-Zugriff in das BackUp-Array kopieren
' global deklarierte Variable
Call CopyMemory(gPicBackup(0, 0), pic(0, 0), bmp.PixelHeight * _
bmp.BytesWidth)
' Overlay-Array wieder freigeben (wichtig!)
Call CopyMemory(ByVal VarPtrArray(pic), 0&, 4)
' DC freigeben
Call ReleaseDC(0&, lngDC) Danke für Hilfe jeder Art. |