vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 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

Fortgeschrittene Programmierung
Umwandlung in schwarz-weiss 
Autor: jopeku
Datum: 25.04.16 18:44

Guten Abend,

und wieder ein Frage an die Fachleute

Ich möchte ein, in eine PictureBox geladenes Bild unabhängig von seiner
Farb-Ausgangssituation in reines Schwarz/Weiss umwandeln.

Im I-Net gibt es viele Beispiele für Farbänderung aber nichts was ich
gefunden hätte bezieht sich auf diesen Fall.

Für etwas Hilfe (etwas Quellcode) wäre ich dankbar.

Grüße jopeku
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: Manfred X
Datum: 25.04.16 19:20

Hallo!

Wenn Du keine Graphik-Bibliotheken einsetzen, sondern die
Bildmanipulation per VB6 erledigen willst, solltest Du
Verfahren wie hier gezeigt verwenden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: jopeku
Datum: 25.04.16 21:03

Guten Nabend Manfred X,

und danke für die Antwort und den Link.

Allerdings wollte ich nicht gleich eine komplette Bildverarbeitung entwickeln
Geht es nicht pixelweise vielleicht etwas einfacher?

Bei den anderen Lösungen zum Beispiel 16-Farb-Umwandlung oder Graustufen
arbeiten die meisten Leute mit GetPixel und SetPixel....dachte das wäre auch mit S/W möglich...?

Grüße

jopeku
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: Manfred X
Datum: 25.04.16 21:22

Die Methoden "GetPixel" und "SetPixel" kenne ich als
Bestandteil der Bitmap-Klasse in VB.Net.

Das hier ist das VB5/6-Forum ("Classic").
Die entsprechenden VB6-Methoden wären "Point" (Abfrage)
und "PSet" (Zuweisung einer Pixelfarbe).
Diese Methoden eignen sich nur für einzelne Pixel,
für die Umwandlung ganzer Bilder sind sie zu ineffizient.

VB6 bietet keine integrierten Bildverarbeitungs-Routinen.
Es muß auf API-Methoden zurückgegriffen werden, durch die
ein direkter Zugriff auf Bild-Daten möglich ist.

Details

Beitrag wurde zuletzt am 25.04.16 um 21:28:39 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: Zardoz
Datum: 25.04.16 21:28

Hallo jopeku,
probier' mal dies:
Controls: Picturebox mit Bild
  Dim x1&, y1&, Color1&, Rot&, Gruen&, Blau&, Grau&
 
  With Picture1
    .ScaleMode = vbPixels
    .AutoRedraw = True
    For y1 = 0 To .ScaleHeight - 1
      For x1 = 0 To .ScaleWidth - 1
        Color1 = .Point(x1, y1)
        Rot = (Color1 And vbRed)
        Gruen = (Color1 And vbGreen) \ &H100
        Blau = (Color1 And vbBlue) \ &H10000
        Grau = (Rot * 77 + Gruen * 150 + Blau * 28) / 255
        Picture1.PSet (x1, y1), IIf(Grau < 128, vbBlack, vbWhite)
      Next x1
      If (y1 Mod 100) = 0 Then DoEvents
    Next y1
  End With
Mit Api-Funktionen läßt sich das Programm noch beschleunigen.

Gruss,

Zardoz

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: Manfred X
Datum: 25.04.16 21:45

Hallo!

Wenn ich mich recht erinnere, kann die Point-Methode
nur die Farbe an Pixelpositionen abfragen, die aktuell auf
dem Formular sichtbar sind.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: Zardoz
Datum: 25.04.16 21:55

Hallo Manfred X,

Manfred X schrieb:
Zitat:

Wenn ich mich recht erinnere, kann die Point-Methode
nur die Farbe an Pixelpositionen abfragen, die aktuell auf
dem Formular sichtbar sind.

Nein. Wenn AutoRedraw der Picturebox auf True steht, wird das
Bild im Speicher hinterlegt und auf dieses beim Auslesen der
Farben zurückgegriffen. Sowohl bei Point, als auch bei GetPixel.

Gruss,

Zardoz

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: Manfred X
Datum: 25.04.16 22:09

Ja.
Zu beachten ist noch, daß "Point" nur die Farbe an Koordinaten
liefert, die innerhalb der Box liegen.
Die Autosize-Eigenschaft der Picturebox muß "true" sein
oder die Width-/Height-Eigenschaften der Picturebox müssen
so eingestellt sein, daß das geladene Bild vollständig in der
Box angezeigt werden kann.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: jopeku
Datum: 26.04.16 07:58

Guten Morgen,

und vielen Dank an Manfred X und Zardoz

Die Umwandlung in Graustufen hatte ich mit der GDI32.dll schon erreicht.

Die Lösung von Zardoz ist perfekt zumal es sich nur um sehr kleine Bilder
mit einer Höhe von ca. 200 Pixel handelt.

@Zardoz

Wie sehe denn eine Lösung per API aus?

Nochmals vielen Dank. TOP - Forum wo man immer schnell eine Antwort und
eine Problemlösung bekommt

Grüße jopeku
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: Blackbox
Datum: 27.04.16 18:48

Hallo jopeku,

Ein Modul. Den nachfolgenden Code in ein Modul einfügen und dann die öffentliche Funktion mit Parameter der Picturebox aufrufen.

Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" ( _
     ByVal hDC As Long, _
     ByVal nWidth As Long, _
     ByVal nHeight As Long) As Long
 
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" ( _
     ByVal hDC As Long) As Long
 
Private Declare Function SelectObject Lib "gdi32.dll" ( _
     ByVal hDC As Long, _
     ByVal hObject As Long) As Long
 
Private Declare Function DeleteObject Lib "gdi32.dll" ( _
     ByVal hObject As Long) As Long
 
Private Declare Function DeleteDC Lib "gdi32.dll" ( _
     ByVal hDC As Long) As Long
 
Private Declare Function SetPixel Lib "gdi32.dll" ( _
     ByVal hDC As Long, _
     ByVal x As Long, _
     ByVal y As Long, _
     ByVal crColor As Long) As Long
 
Private Declare Function GetPixel Lib "gdi32.dll" ( _
     ByVal hDC As Long, _
     ByVal x As Long, _
     ByVal y As Long) As Long
 
Private Declare Function BitBlt Lib "gdi32.dll" ( _
     ByVal hDestDC As Long, _
     ByVal x As Long, _
     ByVal y As Long, _
     ByVal nWidth As Long, _
     ByVal nHeight As Long, _
     ByVal hSrcDC As Long, _
     ByVal xSrc As Long, _
     ByVal ySrc As Long, _
     ByVal dwRop As Long) As Long
 
Private Const SRCCOPY As Long = &HCC0020
 
 
Public Function Color2BlackWhite(ByRef oPic As PictureBox) As Long
    Dim hmemDC As Long
    Dim hBM As Long
    Dim x As Long, y As Long
    Dim Color As Long, Rot As Long, Gruen As Long, Blau As Long, Grau As Long
    Dim hDC As Long, w As Long, h As Long
 
    hDC = oPic.hDC
    w = oPic.ScaleWidth
    h = oPic.ScaleHeight
 
    'Gerätekontext im Speicher erstellen
    hmemDC = CreateCompatibleDC(hDC)
    If hmemDC = 0 Then
        Color2BlackWhite = -10
        Exit Function
    End If
    hBM = CreateCompatibleBitmap(hDC, w, h)
    If hBM = 0 Then
        DeleteDC hmemDC
        Color2BlackWhite = -20
        Exit Function
    End If
    SelectObject hmemDC, hBM
 
    'Bild pixelweise ins Memory kopieren und modifizieren
    For y = 0 To h
        For x = 0 To w
            Color = GetPixel(hDC, x, y)
            Rot = (Color And vbRed)
            Gruen = (Color And vbGreen) \ &H100
            Blau = (Color And vbBlue) \ &H10000
            Grau = (Rot * 77 + Gruen * 150 + Blau * 28) / 255
            If Grau > 128 Then
                SetPixel hmemDC, x, y, vbWhite
            End If
        Next
    Next
 
    'Ursprüngliches Bild löschen
    Set oPic.Picture = Nothing
    oPic.AutoRedraw = False
 
    'Mit einem Rutsch vom Speicher ins Bild
    BitBlt oPic.hDC, 0, 0, w, h, hmemDC, 0, 0, SRCCOPY
 
    'GDI Speicher klären
    DeleteObject hBM
    DeleteDC hmemDC
End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Umwandlung in schwarz-weiss 
Autor: jopeku
Datum: 27.04.16 20:20

Guten Nabend Blackbox,

recht herzlichen Dank!

Habe es gleich mal mit einem Bild 1500 x 2200 Pixel getest.
Und schwubb..... war es fertig

Geht wirklich sehr schnell.

Grüße jopeku
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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