Bild laden und auf die Pixeln zugreifen

Turcy

Grünschnabel
Hallo,

ich sitze gerade vor einem Problem. Also ich muss mit MFC ein Bild laden und die Bildinformationen z.B. Helligkeit verändern. Das Problem ist, ich weiß nicht wie ich direkt auf die einzelnen Pixeln der Bitmapdateien zugreifen kann. :confused: Ich habe im Google lange gesucht. Es wurde immer das Bild im onDraw auf dem Fenster geladen und danach mit
pCD Objekt auf die Pixel zugegriffen. Das Problem ist, man kann danach das Bild nicht übernehmen. :confused:
 
Hallo Turcy,

also folgendermaßen sollte es funktionieren :

Code:
    ..
    // Das Bild in eine CBitmap laden
    CBitmap bmp;
    HBITMAP hBmp = LoadImage(...);
    bmp.Attach(hBmp);

    // Nun erzeugst du dir einen Device-Kontext und selektierst die Bitmap
    CDC dc;
    dc.CreateCompatibleDC(GetWindowDC());
    CBitmap *pOldBmp = dc.SelectObject(&bmp);

    // Hier kannst du nun über den DC mit der Bitmap arbeiten
    // z.B. GetPixel(), SetPixel()

    dc.SelectObject(pOldBmp);
    ..

Ich hoffe es hilft dir.

Schöne Grüße,

Peter
 
Zuletzt bearbeitet:
Hi again,

Ich dachte, du wolltest nur die Bildinformationen in einer Bitmap ändern.

Dass du diese auch darstellen willst hast du nicht geschrieben ;-)

Zitat : Also ich muss mit MFC ein Bild laden und die Bildinformationen z.B. Helligkeit verändern

Wenn du deine Bitmap auch darstellen willst mach das in der OnDraw-Methode.

Code:
BOOL CMyView::OnDraw(CDC* pDC) {
    CRect rc;
    GetClientRect(&rc);

    CDC tmpDC;
    tmpDC.CreateCompatibleDC(pDC);
    CBitmap *pOldBmp = tmpDC.SelectObject(&m_myBmp);
    pDC->BitBlt(..);
    tmpDC.SelectObject(pOldBmp);
    
    return 1;
}

Wie gesagt, die Bildinformationen kannst du mit dem Mechanismus meiner letzten Nachricht ändern.

Gruß,

Peter
 
Zuletzt bearbeitet:
Hallo,

ich habe den Code in meinem Programm integriert. Ich bekomme folgende Fehlermeldungen

"SHLoadDIBitmap": Bezeichner wurde nicht gefunden.
'CreateCompatibleBitmap': Ist kein Element von 'CDC'

Für CDC gibt es aber CreateCompatibleDC. Ich weiß aber nicht ob ich das einsetzen kann.

Gruß
 
Hi,

klar, das sollte CreateCompatibleDC heissen! Ist korrigiert.

Und SHLoadDIBitmap() ist eine Funktion aus der Windows CE 5.0 SDK.
Entschuldige, ich programmiere im moment ausschließlich Windows CE.

Also dann die Bitmap mit LoadImage() oder ähnlichem laden.

Peter
 
Also ich habe etwas hinbekommen. Ich kann mein Bild manipulieren. Also die einzelnen Pixel verändern und auf dem Bildschirm ausgeben.

PHP:
int CLoadBitmapView::LoadImage(CDC* pDC)
{
	CBitmap bmp;
	bmp.LoadBitmapW(IDB_BITMAP1);

	BITMAP bm;
	bmp.GetObject(sizeof(bm), &bm);

	CDC dc;
	dc.CreateCompatibleDC(GetWindowDC());
    CBitmap *pOldBmp = dc.SelectObject(&bmp);

	pDC->BitBlt(10, 10,bm.bmWidth, bm.bmHeight, &dc, 0,0, SRCCOPY);

	return 0;
}


Aber wie übernehme ich das Bild? bzw. wie überschreibe ich das alte Bild?

Gruß
 
Hi,

wie rufst du LoadImage auf? Ich nehme an, aus der OnDraw, richtig?

Das ist nicht gut.

Halte dir die Bitmap als Membervariable in deiner View Klasse. Von mir aus m_myBmp;

Dann lädst du die Bitmap-Resource z.B. in der OnInitialUpdate-Methode.

Auf den View blittest du dann immer diese Bitmap, auf der du deine Änderungen auch durchführst.

In der OnDraw sollte dein Code dann so aussehen:

Code:
..
    CDC dc; 
    dc.CreateCompatibleDC(pDC);
    CBitmap *pOldBmp = dc.SelectObject(&m_myBmp); 

    pDC->BitBlt(10, 10,bm.bmWidth, bm.bmHeight, &dc, 0,0, SRCCOPY);
..

Was meinst du mit übernehmen? Die geänderte Bitmap wieder als File wegschreiben?

Gruß,

Peter
 
Zuletzt bearbeitet:
Danke ok jetzt weiß ich was ich falsch gemacht habe. ich habe alles in View gemacht. Ich muss die Sachen in Doc Datei machen und Serialisieren. Das Speichern und Öffnen macht MFC automatisch glaube ich.

Gruß

Turcy
 

Neue Beiträge

Zurück