| |
Suche Visual-Basic CodeRe: Pixelsearch Funktion | | | Autor: Manfred X | Datum: 09.10.12 20:41 |
| Hallo!
So ganz klar ist mir das Ziel noch nicht.
Hier mal eine Funktion, der als Parameter eine 24Bit-Bitmap übergeben
wird und eine Farbe (als System.Drawing.Color).
Die Bildbreite muss in dieser Demo durch vier teilbar sein,
sonst ist die reale Scanbreite (stride) zu beachten.
Zurückgegeben wird die erste Position der gefundenen Farbe als
Point-Struktur. Man beachte die Indizierung der Doppelschleife -
dadurch wird festgelegt, was als erste Position gilt.
Das Speicherlesen der (temporär gesperrten) Bilddaten geschieht über
Interop.Marshaling.
Es ist systemabhängig, ob R/G/B oder B/G/R als Reihung der Farbbytes
genutzt wird.
(Die Farbe an einer bestimmten Position ermittelt man einfach durch
die GetPixel-Methode des Bitmap-Objekts.)
Grob getestet ....
Public Function FindColorPosition(ByVal bmp As Bitmap, _
ByVal colortofind As Drawing.Color) As _
Point
If bmp.PixelFormat <> Imaging.PixelFormat.Format24bppRgb Then
Throw New ArgumentException("Format not supported")
End If
Dim colorposition As New Point(-1, -1)
Dim searchrect As Rectangle = New Rectangle(0, 0, bmp.Width, bmp.Height)
' Bilddaten (ggf. Ausschnitt) im Speicher sperren
Dim bmp_data As Drawing.Imaging.BitmapData = _
bmp.LockBits(searchrect, Drawing.Imaging.ImageLockMode.ReadWrite, _
bmp.PixelFormat)
' Adresse des Beginns der Bitmap-Bilddaten ermitteln
Dim bmp_ptr As IntPtr = bmp_data.Scan0
' tatsächliche Breite des Bildes
Dim str As Integer = bmp_data.Stride
If str <> bmp.Width * 3 Then
bmp.UnlockBits(bmp_data)
Throw New ArgumentException("Bitmap-Width not supported")
End If
' Array für Bitmapdaten in geeigneter Größe erstellen
' (24-Bit-Bitmap: 3 Byte / Pixel in Bildbreite)
Dim bmp_bytes As Integer = bmp.Width * bmp.Height * 3
' Null-basiertes Byte-Array (muss eindimensional sein)
' in der erforderlichen Größe vereinbaren
Dim bmp_array(0 To bmp_bytes - 1) As Byte
' Die Bitmapdaten in das Array kopieren
Runtime.InteropServices.Marshal.Copy(bmp_ptr, bmp_array, 0, bmp_bytes)
Dim byte_index As Integer = -3, endloop As Boolean? = False
With colortofind ' Die Bilddaten bearbeiten
' (Doppelschleife mit y-x-pixelbezogenem Zugriff
' auf die Daten im Array)
For y As Integer = 0 To bmp.Height - 1
For x As Integer = 0 To bmp.Width - 1
' Array-Index für x,y-BytePosition,
byte_index += 3
'Hier Farbbyte-Reihenfolge B/G/R oder R/G/B nutzen
If bmp_array(byte_index) = .B And _
bmp_array(byte_index + 1) = .G And _
bmp_array(byte_index + 2) = .R Then
colorposition.X = x
colorposition.Y = y
endloop = True
Exit For
End If
Next x
If endloop Then Exit For
Next y
End With
' Die gesperrten Bilddaten freigeben
bmp.UnlockBits(bmp_data)
Return colorposition
End Function MfG
Manfred | |
| 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 |
|
|
TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|
|
|
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
|
|