| |
Fortgeschrittene ProgrammierungUmwandlung 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 | |
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. | |
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 | |
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. | |
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 | |
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. | |
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. | |
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 | |
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 | |
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 | |
| 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 |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. 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
|