Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Einzelne Pixel setzen/Lesen

Einzelne Pixel setzen/Lesen
20.02.2008 12:49:19
Christian
Hallo, bin neu hier im Forum, habe es aber ohne Registrierung schon oft genutzt! Also schon mal vielen Dank an alle, ihr habt mir oft geholfen :-)
Nur bei einer Sache bin ich trotz intensiver Forum und Google-Recherche nie weitergekommen:
Gibt es einen Weg einzelne Pixel in einem Control oder UserForm zu setzen und auszulesen?
In vielen Basic-Dialekten gibt es PSET(x,y), c zum setzen eines Punktes. c = POINT(x,y) zum lesen eines Punktes.
Gibt es soetwas auch in VBA?
Es sind schon viele eigene Versuche ins Land gegangen, aber ich komme nicht weiter!
Ziel wäre es z.B. ein Image (.Picture) Pixelweise auszulesen und ggf. zu modifizieren!

Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Einzelne Pixel setzen/Lesen
20.02.2008 14:30:00
Christian
Ich merke schon... ist anscheinend kein Fachgebiert hiert ;-)

AW: Einzelne Pixel setzen/Lesen
20.02.2008 14:55:22
Knut
Hi,
das geht mangels geeignetem control in VBA gar nicht.
mfg Knut

AW: Einzelne Pixel setzen/Lesen
20.02.2008 20:06:35
Volti
Hallo Christian,
da müsstest Du, wenn du das unbedingt brauchst, die Windows-API bemühen.
Dort werden Funktionen wie
FUNCTION SetPixel LIB "GDI32.DLL" ALIAS "SetPixel" (BYVAL hdc AS DWORD, BYVAL x AS LONG, BYVAL y AS LONG, BYVAL crColor AS DWORD) AS DWORD
FUNCTION GetPixel LIB "GDI32.DLL" ALIAS "GetPixel" (BYVAL hdc AS DWORD, BYVAL x AS LONG, BYVAL y AS LONG) AS DWORD
angeboten.
Allerdings brauchst Du hierfür zunächst das handle einer Zeichenfläche (hDC) auf der Du die Aktion durchführen willst.
Ermittlung zum Beispiel so:
FUNCTION GetDC LIB "USER32.DLL" ALIAS "GetDC" (BYVAL hWnd AS DWORD) AS DWORD
Hierfür brauchst Du dann wieder das Fensterhandle, in dem Du die Aktion machen willst.
Zum Beispiel so:
FUNCTION FindWindow LIB "USER32.DLL" ALIAS "FindWindowA" (lpClassName AS ASCIIZ, lpWindowName AS ASCIIZ) AS LONG
oder so
FUNCTION GetForegroundWindow LIB "USER32.DLL" ALIAS "GetForegroundWindow" () AS DWORD
usw.
Achtung: Die o.a. declares sind nicht von VB oder VBA sondern von Powerbasic. Die anderen habe ich gerade nicht zur Hand.
Am besten suchst Du die angegebenen Funktionen mal über Google und schaust Dir die angebotenen Links zu "ActiveVB" an. Da wirst Du bestimmt fündig werden.
ungetestetes Beispiel:
hWnd = GetForegroundWindow
hDC = GetDC(hWnd)
Farbe = GetPixel(hDC, xPos, yPos)
viele Grüße
Karl-Heinz

Anzeige
AW: Einzelne Pixel setzen/Lesen
20.02.2008 20:13:54
Volti
Hi,
hier noch ein Nachtrag.
Hatte überlesen, das Du nicht einfach von einem Fenster sondern von einem Control das Pixel lesen/setzen willst. Geht grundsätzlich genauso. Schwierig wird's nur das handle des Controls (Childwindow) zu bekommen. Auch dafür gibt es jede Menge API-Funktionen, aber da wird es dann schon aufwändig.........
Gruß
KHV

Anzeige
AW: Einzelne Pixel setzen/Lesen
20.02.2008 20:56:57
Nepumuk
Hallo Karl-Heinz,
das kannst du vergessen. Die Controls der FM20.dll sind keine Fenster sondern eingebettete Objekte ohne Handle. Damit auch ohne Device Context und ohne den kommst du an die Pixel nicht ran.
Gruß
Nepumuk

AW: Einzelne Pixel setzen/Lesen
21.02.2008 11:26:00
Christian
Na ok, dann knick ich das vorhaben mal.. Trotzdem vielen Dank an alle!

Anzeige
VBA
21.02.2008 11:50:00
haris
hallo,
habe folgendes problem:
0-0041412-0
41412
0-0160691-5
160691-5
0-1241794-2
1241794-2
1-0480698-0
1-480698-0
9-0929342-1
9-923342-1
8-1419154-1
8-1418154-1
0-1254879-0
125479
gibt es eine möglichkeit via wenn formel bzw. VBA aus den nummern, die nuller so heraus-zu filtern das nur das untere format übrig bleibt?!?

Anzeige
AW: VBA
21.02.2008 18:09:00
Olaf
Hi,
fasch platziiert, Frage neu stellen.
mfg Olaf

AW: VBA
22.02.2008 07:01:56
harris
wie meinst du falsch plaziert?

AW: Einzelne Pixel setzen/Lesen
21.02.2008 21:31:10
Volti
Hallo Nepumuk,
nachdem ich nun ein wenig mit meinem selfmade-Pixel- u. Objektgrabber mit der Maus über meine Excelsheets gefahren bin, muss ich Dir leider recht geben. Da tut sich nix innerhalb eines Sheets mit eingebetteten Objekten.
viele Grüße
Karl-Heinz

Anzeige
AW: Einzelne Pixel setzen/Lesen
22.02.2008 09:25:04
Nepumuk
Hallo Karl-Heinz,
wenn du das Bild direkt ins Userform lädst (das hat ja auch eine Picture-Eigenschaft) dann würde es gehen.
Gruß
Nepumuk
;
Anzeige
Anzeige

Infobox / Tutorial

Einzelne Pixel in VBA setzen und lesen


Schritt-für-Schritt-Anleitung

Um einzelne Pixel in VBA zu setzen oder zu lesen, kannst du die Windows-API verwenden. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor in Excel (ALT + F11).

  2. Füge ein neues Modul hinzu (Rechtsklick auf "VBAProject" -> Einfügen -> Modul).

  3. Deklariere die benötigten Windows-API-Funktionen. Kopiere den folgenden Code in dein Modul:

    Declare PtrSafe Function SetPixel Lib "GDI32.DLL" (ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
    Declare PtrSafe Function GetPixel Lib "GDI32.DLL" (ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long) As Long
    Declare PtrSafe Function GetDC Lib "USER32.DLL" (ByVal hWnd As LongPtr) As LongPtr
    Declare PtrSafe Function GetForegroundWindow Lib "USER32.DLL" () As LongPtr
  4. Nutze die Funktionen in deinem Code. Hier ein Beispiel, wie du einen Pixel setzen und lesen kannst:

    Sub SetAndGetPixel()
        Dim hWnd As LongPtr
        Dim hDC As LongPtr
        Dim color As Long
        Dim xPos As Long, yPos As Long
    
        ' Setze die Position des Pixels
        xPos = 10
        yPos = 10
        ' Setze die Farbe (z.B. Rot)
        color = RGB(255, 0, 0)
    
        ' Hole das Handle des aktuellen Fensters
        hWnd = GetForegroundWindow
        ' Hole den Device Context
        hDC = GetDC(hWnd)
    
        ' Setze den Pixel
        SetPixel hDC, xPos, yPos, color
        ' Lese den Pixel
        color = GetPixel(hDC, xPos, yPos)
    
        ' Ausgabe der Farbe in der Konsole
        Debug.Print "Der gelesene Pixel hat die Farbe: " & color
    End Sub

Häufige Fehler und Lösungen

  • Problem: "Das Control hat kein Handle."

    • Lösung: Stelle sicher, dass du mit einem Fenster oder UserForm arbeitest, das ein Handle hat. Eingebettete Objekte in Excel können oft kein Handle bereitstellen.
  • Problem: "Funktion nicht gefunden."

    • Lösung: Überprüfe, ob du die Deklarationen der Funktionen korrekt in deinem Modul eingefügt hast. Achte darauf, ob du die PtrSafe-Erweiterung benötigst, besonders in neueren Excel-Versionen.

Alternative Methoden

Wenn du mit GetPixel und SetPixel Schwierigkeiten hast, kannst du auch andere Methoden in Betracht ziehen:

  • PictureBox-Control: Lade dein Bild in ein PictureBox-Control und nutze die Point-Methode, um Farben an bestimmten Positionen abzurufen.
  • Excel-Zellen: Wenn es um die Darstellung von Farben geht, kannst du auch Excel-Zellen direkt färben, anstatt mit Pixeln zu arbeiten.

Praktische Beispiele

Hier ist ein Beispiel, wie du ein Bild in ein UserForm laden und einzelne Pixel lesen kannst:

Private Sub UserForm_Initialize()
    Me.Image1.Picture = LoadPicture("C:\Pfad\zu\deinem\Bild.jpg")
End Sub

Private Sub CommandButton1_Click()
    Dim color As Long
    color = GetPixel(hDC, 10, 10) ' Beispielkoordinaten
    MsgBox "Die Farbe des Pixels ist: " & color
End Sub

Tipps für Profis

  • Arbeite mit der Windows-API, um eine tiefere Kontrolle über Graphikoperationen zu erhalten.
  • Nutze RGB-Funktion, um Farben leichter zu definieren.
  • Experimentiere mit verschiedenen Pixelpositionen, um ein besseres Verständnis für die Funktionsweise zu bekommen.

FAQ: Häufige Fragen

1. Kann ich GetPixel auch in Excel 2010 verwenden? Ja, die genannten API-Funktionen sind auch in Excel 2010 verfügbar, solange die Deklarationen korrekt sind.

2. Was kann ich tun, wenn ich kein Handle für mein Control bekomme? In diesem Fall solltest du überlegen, ob du das Bild direkt in ein UserForm lädst, da dies die Handhabung von Pixeln erleichtern kann.

3. Gibt es Einschränkungen bei der Verwendung von Windows-API in VBA? Ja, du musst sicherstellen, dass alle API-Deklarationen korrekt sind und die entsprechenden Typen in VBA verwendet werden, um Laufzeitfehler zu vermeiden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige