Bild in Graustufen umwandeln



  • Hallo zusammen!
    Also vorweg muss ich gleich noch schreiben, dass ich gerade erst angefangen hab mich mit VC++ zu beschäftigen.
    Ich wollte ein Bild in Graustufen umwandeln indem ich aus einem Bildfeld mit GetPixel jeden einzelnen Pixel auslese und ihn dann als Grauwert in ein anderes Bildfeld schreibe mit SetPixel.
    Jetzt mein Problem:
    SetPixel funktioniert ja noch aber GetPixel nicht. Da krieg ich immer nur -1 zurück.
    Welchen DC muss ich denn da erstellen(bzw. Wie muss ich den erstellen??) um die Pixel aus dem Bildfeld auszulesen???

    Vielleicht kann mir ja jemand mal ein kleines Beispiel posten wie ich die Pixel aus einem Bild auslese.

    Danke schonmal und ein frohes Fest an alle
    Ronnie



  • Höö? Du holst dir einfach nen DC... und darein selectest du dann die Bitmap ... dann kannst du da mit GetPixel und SetPixel auch schön deine Graustufe reinmachen wenn dus willst...



  • Wenn Du zeit hast, kannst du das mit getpixel und setpixel machen, aber ich würde dir davon abraten.

    void CPicture::MakeGrayPicture(CBitmap &bitmap)
    {
    	if(!this->m_hObject) return;
    
    	CPalette pal;
    	UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * 256);
    	LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
    
    	pLP->palVersion = 0x300;
    	pLP->palNumEntries = 256;
    
    	for( int i=0; i < 256; i++)
    	{
    		pLP->palPalEntry[i].peRed = i;
    		pLP->palPalEntry[i].peGreen = i;
    		pLP->palPalEntry[i].peBlue = i;
    		pLP->palPalEntry[i].peFlags = 0;
    	}
    
    	pal.CreatePalette( pLP );
    
    	BITMAP     bm;
    	bitmap.GetObject(sizeof(BITMAP), (LPSTR)&bm);
    
    	BYTE *bmpBuffer = new BYTE[ bm.bmWidthBytes*bm.bmHeight ];//allocate memory for image 
                                                  //byte buffer
    
    	ULONG dwValue=bitmap.GetBitmapBits(bm.bmWidthBytes*bm.bmHeight,
                       bmpBuffer);//Get the bitmap bits  
                                  //into a structure*/
    	DWORD* buffer = (DWORD*)bmpBuffer;
    	for(ULONG Count = 0;Count < dwValue/4;Count++)
    	{
    		UINT Index = pal.GetNearestPaletteIndex(buffer[Count]);
    		buffer[Count] = RGB(pLP->palPalEntry[Index].peRed,
    							pLP->palPalEntry[Index].peGreen,
    							pLP->palPalEntry[Index].peBlue);
    	}
    
    	delete[] pLP;
    
    	dwValue = bitmap.SetBitmapBits(bm.bmWidthBytes*bm.bmHeight,bmpBuffer);
    	delete bmpBuffer;
    }
    

    Wenn ich jetzt keine fehler gemacht habe, ist dann deine übergebene Bitmap in graustufen konvertiert. Dann kannst du sie mit bitblt zbsp. in deinen ausgabebereich blitten.

    frohe weihnachten
    gruß Matthias



  • also.
    folgendes problem. ich will mein bitmap auch in graustufen umwandeln.
    das problem is dass ich die einzelnen pixel daten dann binär oder hexadezimal
    benötige um sie über meinen mikrocontroller weiter ans display zu schicken.
    kann mir da jemand helfen?



  • Wo ist da das Problem? int-Werte werden intern im Binärformat gespeichert, also kannst du sie einfach dahin übergeben, wo du sie brauchst.



  • dann würd ich sagen is mein größtes problem dass ich kein c++ programmieren kann. also ich geh mal ins detail.
    es sollen aus einer liste(dort is dann schon pfad des Bitmaps gespeichert) alle objekte in den speicher eines mikrocontrollers gespielt werden. die programmierung auf der μc seite is kein problem.
    ich muss dass bild ja - so rein vom logischen her - erst laden und dann kannsch mir die einzelnen pixeldaten vornehmen.(sind übrigens erstmal nur 40x32 px)

    mit welcher klasse muss ich jetz das bitmap laden? CDC? da find ich nämlich nur "getcurrentbitmap" und das hilft mir irgendwie nich - bzw die erklärung im msdn hilft mir nich weiter.

    es sind sicher nur n paar zeilen. vielleicht kannst du mir mal nen kurzen quelltext schreiben? z.B. um Pixel(3,3) zu bekommen.
    wär echt super.
    danke



  • Ich würde die Bilddatei per fstream in ein Array/vector einlesen und anschließend per Hand auswerten. (aber dazu müsste man wissen, wie ein BMP aufgebaut ist)

    *grübelt* CBitmap hat eine Methode LoadBitmap(), um ein Bild aus den Ressourcen zu laden - kommt die eigentlich auch mit einer Pfad-Angabe zurecht?



  • du könntest diese funktion benutzen: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/introductiontoresources/resourcereference/resourcefunctions/loadimage.asp
    die kann bilder aus dateien in eine dibsection laden. mit dibsections hat man direkten zugriff auf die pixeldaten und kann die bearbeiten...



  • also mit CBitmap habsch auch schon das bild geladen und wie in ne art vorschau angezeigt. pfadangaben sind da gar kein problem. aber das mit dem fstream habsch auch schon probiert. aber so richtig wollte das auch nich.
    also wennsch die rohdaten gern per hand auswerten. dazu müsst ich sie mir aber auch erstma irgendwie darstellen können (in nem dialogfeld - MFC) und das einlesen klappt ja auch irgendwie nich

    hab mir auch grad mal das mit DIBSECTION angeschaut. aber da weiß ich gar ni mehr wie ich ran gehn soll. ich seh da nur ne struktur in der ich die dsBitfields haben will, wenn ich das richtig verstehe.
    aber wie ich n geladenes bitmap pixel für pixel abklappere is mir nich so wirklich klar.



  • also. ich hab mal nochn bissel weitergestöbert und bin dabei auf dieses projekt gestoßen. vielleicht kennt das ja einer.
    http://www.codeproject.com/bitmap/cximage.asp
    auf jeden fall hab ich mir den source code mal runtergeladen und versuche diesen grad einzubinden. da sagter mir aber schon ohne dass ich was dazu geschrieben hab "unerwartetes dateiende waehrend der suche nach der direktive für die vorkompilierte header-datei" - was auch immer das bedeutet.

    ich bin für jede hilfe dankbar.


Anmelden zum Antworten