RGB-pixel in Dialog per Code schreiben und als BMP speichern ?
-
Hallo Gemeinde .. ich bin neu hier und das ist mein erster Beitrag
Ich bekomme das einfach nicht in den Griff
Ich habe hier mit MFC ein Dialog erstellt, in dem ich ein Bild selber pixel für pixel erzeugen will.
Ich möchte sozusagen per Koordinaten- und RGB-angaben Bildpunkte setzen.
Als Referenz habe ich den "SpecialFX"-Code von Codeguru heruntergeladen. Nutze die Klasse DIBSectionLiteIch bin soweit, dass ich ein Bild im Dialog anzeigen kann ... kann aber immernoch nicht auf die RGB-Daten zugreifen (um z.Bsp. Pixeldaten auszulesen).
eigentlich habe ich drei Dinge vor ... ich denke, dass die Realisierung ähnlich sein wird.
Zum Ersten:
Ich möchte ein Bild mit Hilfe von Algorithmen kreieren.
Es sollen zufallsgenerierte Grafiken werden.
Das generieren von Farbwerten ist kein Problem (also R,G,B).
Mein Problem ist. wie bilde ich das pixel für pixel in einem Dialog ab.
Das Ganze soll zum Verständnis dienen, um später evtl. Farbfilter programmieren zu können, in denen ich auf nebeneinanderliegende Pixel achten muß(Blur etc).Zum Zweiten:
Ein derart generiertes Bild soll mir Farbinformationen anhand der Mauskoordinaten über dem Bild geben.
Das heißt, dass wenn ich im Dialog auf eine Stelle klicke, dann bekomme ich Info über R,G und B.Zum Dritten:
Dieses Bild sowohl als BMP, als auch in einem Eigenen Format speichern (Textexport).
Der Textexport wäre eigentlich nur eine Datei, in der für jeden normalen menschen lesbar die pixelinformationen stehen.
etwa so:
0.0.0;255.0.0;0.255.0;\n
0.0.0;255.0.0;0.255.0;\n
0.0.0;255.0.0;0.255.0;\nDas Ganze erfüllt keinerlei Sinn und Zweck (bitte auch nicht nach der Notwendigkeit fragen - es gibt keine
)Mir wurde nun schon oft gesagt, das die Umsetzung dieser Anforderungen ein Kinderspiel sei ... nur scheitere ich derzeit massiv daran.
ich wäre für die Hilfe der Realisierung dieses Programmes oder Programmteile mehr als dankbar.
Codebeispiele geben immer die besten Anhaltspunkte. Wenn ihr Links von Projekten kennt ... her damit ... auf CodeProjects habe ich nur "SpezialFX" gefunden. <- leider verstehe ich das Beeinflussen und Setzen der Pixel in diesem Prog nicht.Ach ja .. ich arbeite mit Visual C++ 6.0 und MFC
Wenn mir jemand helfen könnte ... ich kann das Project (derzeitiger Stand) auch gerne Mailen. Ist aber wirklich nur grob erstellt

meine Mail ist
torspace@gmx.net
-
CDC::GetPixel und CDC::SetPixel?
-
hi,
danke für die Antwort, aber wie verbaue ich das in die Funktion: OnMouseMove
um die RGB-Daten des Dialogs (oder des Bildes im Dialog) unter dem Mauszeiger zu ermitteln ?ich habe das so probiert:
void CBMPTestDlg::OnMouseMove(UINT nFlags, CPoint point) { COLORREF myColor; CPaintDC dcPaint(this); CDC myDC; myDC.CreateCompatibleDC(&dcPaint); point.x -= 7; //linker Rand point.y -= 8; //oberer Rand myColor = GetPixel(myDC, point.x, point.y); r = GetRValue(myColor); g = GetGValue(myColor); b = GetBValue(myColor); rgb_red.Format("ROT :%03i", r); rgb_green.Format("GRÜN:%03i", g); rgb_blue.Format("Blau: %03i", b); m_R.SetWindowText(rgb_red); m_G.SetWindowText(rgb_green); m_B.SetWindowText(rgb_blue); CDialog::OnMouseMove(nFlags, point); }vielen Dank und Grüße
-
GetDC()->GetPixel(point.x,point.y);
-
hi
meine Anwendung stürzt nach einiger zeit ab.
ImTaskmanager habe ich eine Zunahme des Speicherbedarfs beobachtet.
In der mdsn habe ich gelesen, dass nach GetDC unbedingt ReleaseDC folgen muß.
Wie kann ich in diesem Code das freigeben ?
Ich bekomme ständig fehler bei der Verwendung mit ReleaseDCfolgender Code:
void CBMPTestDlg::OnMouseMove(UINT nFlags, CPoint point) { COLORREF myColor; point.x -= 7; //linker Rand point.y -= 8; //oberer Rand myColor = GetDC()->GetPixel(point.x, point.y); r = GetRValue(myColor); g = GetGValue(myColor); b = GetBValue(myColor); rgb_red.Format("ROT :%03i", r); rgb_green.Format("GRÜN:%03i", g); rgb_blue.Format("Blau: %03i", b); m_R.SetWindowText(rgb_red); m_G.SetWindowText(rgb_green); m_B.SetWindowText(rgb_blue); CDialog::OnMouseMove(nFlags, point); }DANKE
-
ungetestet
void CBMPTestDlg::OnMouseMove(UINT nFlags, CPoint point) { COLORREF myColor; //hierfür kannst du dir mal ClientToScreen und ScreenToClient anschauen point.x -= 7; //linker Rand point.y -= 8; //oberer Rand //myColor = GetDC()->GetPixel(point.x, point.y); CWnd* wp; CDC * pDC; wp = GetDlgItem(IDC_....); //oder this verwenden wenn du auf dem dialog direkt rummalerst pDC = wp->GetDC(); myColor=pDC->GetPixel(point.x, point.y); wp->ReleaseDC(pDC); r = GetRValue(myColor); g = GetGValue(myColor); b = GetBValue(myColor); rgb_red.Format("ROT :%03i", r); rgb_green.Format("GRÜN:%03i", g); rgb_blue.Format("Blau: %03i", b); m_R.SetWindowText(rgb_red); m_G.SetWindowText(rgb_green); m_B.SetWindowText(rgb_blue); CDialog::OnMouseMove(nFlags, point); }
-
Windalf schrieb:
ungetestet
wp->ReleaseDC(pDC);das ist quark.
-
das ist quark
vernichtendes Urteil

sag mal was falsch dran ist hab keine Lust mir erst selber ein Proggie zu schreiben um das zu testen
-
Man gibt den DC eines Fensters nicht frei. Ganz einfach.
-
danke erst mal ... aber .. wie schaut der code dann nun richtig aus ?
Danke