Grafik-Manipulation

xFile

Mitglied
hallo,
ich habe schon im forum gesucht - finde jedoch nichts was mir weiter helfen könnte.
mein problem ist folgendes:
ich möchte eine grafik einlesen und dann auf ihre pixel untersuchen.
d.h.: ich habe z.b. eine grafik 100x100 pixel (schwarz/weiß),
zu sehen ist von mir aus ein kreis (hintergrund: weiß / kreis: schwarz).
wie kann ich nun diese grafik (format wäre egal) einlesen und dann jedes pixel überprüfen, ob dieses nun weiß oder schwarz ist?!


gibt es da eine bibliothek, denn in der msdn habe ich nichts gefunden ausser, dass ich halt bitmaps laden und anzeigen kann. (in einer mfc anwendung)

vielen dank
mfg adam
 
Hi,

also für Bitmaps ist es recht einfach.

Mit reiner Win32-API:

Code:
    // Bitmap laden
    HBITMAP hBmp = LoadImage(...);
    // DeviceContext erzeugen
    HDC hDC = ::CreateCompatibleDC(NULL); 
    // Deine Bitmap in den Device Context laden
    HGDIOBJ hOldBitmap = ::SelectObject(hDC, hBmp);
    // Mit dem Device-Context die Pixel auslesen
    COLORREF color = ::GetPixel(hDC, x,y);

    int red    = GetRValue(color);
    int green = GetGValue(color);
    int blue   = GetBValue(color);

    // Am Ende wieder das alte GDI-Objekt selektieren
    ::SelectObject(hDC,hOldBitmap);

    // Device-Context freigeben
    ::DeleteDC(hDC);

Vergiss nicht die Fehlerbehandlung, die ich hier voll ausser Acht gelassen habe ;-)

Falls du gifs oder jpgs oder sonst was laden willst, verwende eine der frei verfügbaren libraries.

Viel Erfolg,

Peter
 
Hi,

freut mich, dass es dir geholfen hat.

Wenn du es im Unterforum MFC gepostet hättest, hätt ich es dir natürlich auch in MFC geschrieben ;)

Viel Erfolg weiterhin,

Peter
 
Was für Möglichkeiten gibt es eigentlich, Bitmaps zu erstellen mit C++ außer das Bitmap-Format zu studieren und dann mit outfile zu arbeiten?

Kann man auch irgendwie schreiben:
C++:
set.pixel(234,50,red); o.ä.?

Braucht man da irgendwelche besonderen Bibliotheken?
 
Hi,

ja, du kannst dir so eine neue Bitmap erstellen:

Code:
    CBitmap bmp;
    bmp.CreateCompatibleBitmap(pDC, breite, höhe);

Diese Bitmap kannst du dann in einen Gerätekontext laden und mit dessen Funktionen bearbeiten.

Hier einige Beispiele:
Code:
    CBitmap *pOldBmp = dc.SelectObject(&bmp);

    // Einzelne Pixel setzen :
    dc.SetPixel(x,y,RGB(0,0,0));
    // Rechteck zeichnen
    dc.FillSolidRect(0,0,breite, höhe, RGB(...));

    // Kreis zecihnen
    dc.Ellipse(0,0,breite, höhe, RGB(...));

    // Am Ende die Bitmap wieder aus den Gerätecontext entfernen
    dc.SelectObject(pOldBitmap);

u.s.w. Schau dir die methoden der Klasse CDC an.

Ciao,

Peter
 
Hi,

also für Bitmaps ist es recht einfach.

Mit reiner Win32-API:

Code:
    // Bitmap laden
    HBITMAP hBmp = LoadImage(...);
    // DeviceContext erzeugen
    HDC hDC = ::CreateCompatibleDC(NULL); 
    // Deine Bitmap in den Device Context laden
    HGDIOBJ hOldBitmap = ::SelectObject(hDC, hBmp);
    // Mit dem Device-Context die Pixel auslesen
    COLORREF color = ::GetPixel(hDC, x,y);

    int red    = GetRValue(color);
    int green = GetGValue(color);
    int blue   = GetBValue(color);

    // Am Ende wieder das alte GDI-Objekt selektieren
    ::SelectObject(hDC,hOldBitmap);

    // Device-Context freigeben
    ::DeleteDC(hDC);

Vergiss nicht die Fehlerbehandlung, die ich hier voll ausser Acht gelassen habe ;-)

Falls du gifs oder jpgs oder sonst was laden willst, verwende eine der frei verfügbaren libraries.

Viel Erfolg,

Peter
Hi,

ich schreibe C-Code mit Microsoft Visual C++, kann ich die funkctionen wie loadBitmap auch benutzen? Oder kann man überhaup ein Bitmap in C erstellen? Ich suche schon seit einer Weile, habe bis jetzt leider nur Funktionen in C++ gefunden ;-(

Vielen Dank für jede Antwort!

Jing
 
Hi Peter,

vielen Dank für die schnelle Antwort! Die Beispiele in WINAPI sind meinsten objekt orientiert, habe ich dann gedacht dass es nur für C++ geeignet ist. Gibt's C Beispiele, mit welchen man anfangen kann?

Dank und Gruß,

Jing
 
Hi Jing,

das Beispiel aus meiner ersten Antwort (welche du auch zitiert hast) ist mit reiner Win32-API geschrieben und ist nicht Objektorientiert.

Diese Funktionen gibt es fast alle als reine C-Funktion und als gebundene Klassenmethode.

z.B.

Win32-API:

HDC ::CreateCompatibleDC(HDC hdc);

Und die entsprechende gekapselte Methode in der MFC:

BOOL CDC::CreateCompatibleDC(CDC *pDC);


Peter
 
Zurück