Bild pixelweise analysieren
-
Hallo zusammen,
ich möchte die einzelnen Pixel eines Bilds (voraussichtlich JPG) analysieren, so dass ich Pixel für Pixel die Helligkeits- und Farbwerte ermitteln und dann zur weiteren Bearbeitung in ein Array schreiben kann. Für Tips zur allgemeinen Vorgehensweise wäre ich sehr dankbar

mfg
benner
-
Schau dir mal die funktion GetPixel() an. Damit bekommst du den RGB-Wert des Pixel.
-
BeNNeR schrieb:
Für Tips zur allgemeinen Vorgehensweise wäre ich sehr dankbar

wie allgemein brauchst du es denn?
ich würde damit anfangen, den computer einzuschalten und visual c++ zu starten. falls dann irgendwelche konkreten probleme auftauchen sollten, kannst du ja nochmal hier fragen.
-
hilfreich schrieb:
BeNNeR schrieb:
Für Tips zur allgemeinen Vorgehensweise wäre ich sehr dankbar

wie allgemein brauchst du es denn?
ich würde damit anfangen, den computer einzuschalten und visual c++ zu starten. falls dann irgendwelche konkreten probleme auftauchen sollten, kannst du ja nochmal hier fragen.will ich sehen, wie du visual c++ startest
ich würde visual studio starten, dann klappts eher, denke ich.BTT: such dir bei google mal eine geeignete klasse / library für jpg-dateien. das wäre der erste schritt. dabei sollte dir google oder auch codeproject bzw. codeguru helfen.
edit: http://cimg.sourceforge.net/reference/group__cimg__tutorial.html <- schaut ganz gut aus...
-
Machine schrieb:
will ich sehen, wie du visual c++ startest

`Setting environment for using Microsoft Visual Studio 2005 x86 tools.
D:\VS8\VC>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
D:\VS8\VC>`
war gar nicht schwer, nächste aufgabe!!?
-
Microsoft Visual Studio 2005
:p
-
So, mit Bitmap funktioniert erstmal alles. Vielen Dank nochmal für alle hilfreichen (und weniger hilfreichen
) Antworten. Ich mag dieses Forum 
-
Ich habe das jetzt folgendermaßen gelöst: Das Laden des Bitmaps erfolgt in einer einzelnen Methode:
// Bitmap wird geladen void Cbitmap_einlesenView::OnBnClickedButtonLoad() { if(m_hBitmap != NULL) ::DeleteObject(m_hBitmap); m_hBitmap = (HBITMAP)::LoadImage( 0, "Unbenannt.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); if(m_hBitmap == NULL) { AfxMessageBox("Konnte Bitmap nicht öffnen\n"); return; } b_loadPicture = true; this->RedrawWindow(); }Anschließend folgt die Anzeige des Bitmaps in der Methode OnDraw(...):
void Cbitmap_einlesenView::OnDraw(CDC* pDC) { BITMAP BitmapParam; CDC *pMemDC = new CDC; BOOL bRetCode = pMemDC->CreateCompatibleDC(pDC); ASSERT(bRetCode); CBitmap* pCBitmap = CBitmap::FromHandle(m_hBitmap); pMemDC->SelectObject(pCBitmap); pCBitmap->GetBitmap(&BitmapParam); n_picHeight = BitmapParam.bmHeight; n_picWidth = BitmapParam.bmWidth; pDC->BitBlt(0,0,n_picWidth,n_picHeight,pMemDC,0,0,SRCCOPY); delete pMemDC; }Das Beispiel ist aus einem Tutorial übernommen. Bei der Anzeige treten keine großen Verzögerungen auf. Meine Frage ist jetzt, wie ich am sinnvollsten eine Manipulation des Bildes vornehmen kann, bevor es angezeigt wird. Ich könnte direkt in der OnDraw() Methode mit Get/SetPixel() arbeiten. Aber ich möchte Manipulation und Anzeige getrennt voneinander handhaben können. Das Bitmap in ein Array einzulesen, dieses dann zu ändern und anschließend anzuzeigen dauert entschieden zu lange (fast 10 Sekunden für die Anzeige von 1024x768)...
-
google mal nach "CMemDC" mit dieser klasse wird das bld zwischen gepuffert, d.h. es wird bearbeitet, und erst wenn alle pixel aktualisert wurden wird es angezeigt..

-
Also ich habe es jetzt folgendermaßen versucht:
// Bitmap wird geladen void Cbitmap_einlesenView::OnBnClickedButtonLoad() { BITMAP BitmapParam; COLORREF m_Value; HDC hDC, hMemDC; if(m_hBitmap != NULL) ::DeleteObject(m_hBitmap); m_hBitmap = (HBITMAP)::LoadImage( 0, "D:\\Unbenannt.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); if(m_hBitmap == NULL) { AfxMessageBox("Konnte Bitmap nicht öffnen\n"); return; } hDC = (HDC)GetDC(); hMemDC = CreateCompatibleDC(hDC); GetObject(m_hBitmap, sizeof(BITMAP), (LPSTR)&BitmapParam); SelectObject(hMemDC, m_hBitmap); n_picHeight = BitmapParam.bmHeight; n_picWidth = BitmapParam.bmWidth; for(int j=0;j<BitmapParam.bmHeight;j++) { for(int i=0;i<BitmapParam.bmWidth;i++) { m_Value = GetPixel(hMemDC,i,j); TRACE("%d\n",m_Value); } } }m_hBitmap ist hierbei ein Bitmap-Handle HBITMAP. In der zweifachen For-Schleife möchte ich jetzt die Pixel in ein Array kopieren, aber der Zugriff mit GetPixel scheitern, der return-Wert ist in jedem Falle -1, was ja lt. Beschreibung auf einen Fehler schließen lässt. Dieser wird wohl mit hMemDC zusammenhängen...wenn mir jemand meinen Fehler aufzeigen könnte, wäre ich dankbar. Eine Erklärung wäre auch klasse, um nicht den selben Fehler noch einmal zu machen. Vielen Dank schonmal
