Bitmap verarbeiten
-
Hallo,
ich möchte gerne ein Programm schreiben in C++ mit der Visual Studio Umgebung (wenn das wichtig sein sollte) bei dem ich eine Bitmap Datei auswählen kann. Dann möchte ich gerne die Breite des Bildes Bestimmen und es in der Mitte Teilen und neu Abspeichern. Die eine Seite soll dann schwarz gezeichnet werden. Das bild soll also in der Größe erhalten bleiben, aber es soll nur noch die Hälfte der Informationen enthalten sein.so habe ich das mal versucht die brete zu ermitteln. Aber wenn ich mir die dann mit cout ausgeben lasse, ist die breite immer 0.
#include <iostream> #include <fstream> ... using namespace std; ... ifstream Quelldatei; Quelldatei.open ("D:\\Source\\Testdaten\\40_01.bmp", std::ios_base::binary | std::ios_base::in); double Breite=Quelldatei.width();was ist da wohlalles falsch oder bessergesagt wie kann ich es anders machen?
wenn noch einer weiß wie ich alle einzelnen Bilder mit C++ aus einem AVI Video bekomme wäre das für mich auch noch sehr interessant.Ich habe bisher noch nicht mit C++ gearbeitet und kenne mich dementsprechend schlecht aus. Also wäre ich über einfache Antworten besonders dankbar.
Danke im Voraus
Timo
-
C++ kennt keine Bitmaps - und width() liefert deshalb auch nicht die Breite einer Bilddatei (hast du dich nicht gewundert, daß es keine Methode "height()" gibt?). Du kannst entweder den Bitmap Header von Hand auslesen und interpretieren, um an deine benötigten Informationen zu kommen - oder du verwendest einen CBitmap.
-
das es kein "height()" gibt hat mich schon gewundert, habe mir aber noch nix weiter dabei gedacht. wie lese ich den bitmap header von hand aus? und wie liest man das dann? was ist ein CBitmap?
-
WilliMC schrieb:
wie lese ich den bitmap header von hand aus? und wie liest man das dann?
Dazu mußt du wissen, wie der Header aufgebaut ist - dann kannst du die einzelnen Werte per read() aus der Datei rauspicken (alternativ nimmst du dir einen BITMAPFILEHEADER und einen BITMAPINFOHEADER und liest dort den kompletten Header rein).
was ist ein CBitmap?
Eine MFC-Klasse, die dir viel Arbeit im Umgang mit BMP's abnehmen kann - ich empfehle die MSDN als Informationsquelle.
-
wenn ich nun alles einlesen wollte, dann könnte man doch eine Struktur erstellen und da die werte einlesen.
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; DWORD biXPelsPerMeter; DWORD biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER;wenn ich das nun in mein programm einfüge, kommt dieser Fehler error C2011: 'tagBITMAPINFOHEADER': 'struct' Typneudefinition. Da kann ich schonmal nix mit anfangen wieder. und wie bekomme ich wenn das denn mal funktioniert über read die daten da rein? in den Klammern muss ich sicher noch den Dateipfad und namen übergeben und dann muss er noch wissen auf welche variable das ganze soll. da müsste ja irgendwie ein zeiger geben der dann immer nach dem einlesen weiter springt oder sowas. oder sonst kann man warscheinlich den offset eingeben wo angefangen werden soll mit lesen. das wäre bei mir dann sozusagen 4 weil mich eigentlich erstmal nur die breite interessiert. würde mich freuen, wenn du mir die read() zeile mal posten könntest wie man sie dann im code auch schreibt.
aber danke schonmal für die antwort. nun weiß ich wenigstens schonmal besser wo ich suchen muss.
-
Punkt 1: Die beiden struct's gibt's schon - die kannst du ganz normal verwenden.
Punkt 2: Zum Einlesen mußt du erstmal die Datei öffnen (das hast du oben schon richtig gemacht) und kannst dann per read() die Daten auslesen:
ifstream datei("test.bmp",ios::binary|ios::in); BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih; datei.read((char*)&bfh,sizeof(bfh)); datei.read((char*)&bih,sizeof(bih)); cout<<"Das Bild ist "<<bih.biWidth<<" x "<<bih.biHeight<<" Pixel groß"<<endl;
-
...und bevor Du nach MFC-Klassen sucht, weil Du Visual Studio Express benutzt (falls Du das tust): Du wirst sie nicht finden, weil VSE keine MFC enthält!
-