2012-04-12 6 views
1

Ja, ich habe durch die anderen Fragen, die damit zu tun haben, aber ich fand sie nicht viel helfen. Sie waren etwas Hilfe, aber ich bin immer noch ein bisschen verwirrt. Also hier was was ich tun muss:C++:. Bmp zu Byte-Array in einer Datei

Wir haben einen 132x65 Bildschirm. Ich habe eine 132x65 .bmp. Ich möchte das BMP durchlaufen und es in kleine 1x8 Spalten trennen, um die Binärdatei dieser 32-Bit-Spalte zu erhalten. Dann mach das 132 mal quer und mach das 9 mal runter. Alles, was nicht weiß ist, sollte als etwas gezählt werden. Beispiel:

Wenn der obere linke Pixel des Bildes eine Farbe ist, die nicht weiß ist und die 7 Pixel darunter weiß sind, dann wäre das das erste Element des Arrays, das Hex dieser Zahl, also würde das Array sieht so aus: array [] = {0x01} und dann würde es weiter durch diese 132 Spalten füllen und dann wieder für 9 "Abschnitte" von Zeilen tun. Und das Ergebnis der Datei wäre NUR das Array in einer separaten Datei.

Ich verstehe das Header-Format dafür, ich habe den Wiki-Artikel auf .bmp-Dateiformate gelesen, mein Hauptproblem ist, ich weiß nicht wirklich, wie ich mit der .bmp interagieren, wenn ich es tatsächlich in und gehen will interagieren mit jedem Pixel aus dem Bild. Ich brauche wirklich nicht die ganze Sache, aber vielleicht nur ein Beispiel dafür, dass ich jedes Pixel von der BMP ergreife und die Farbe des Pixels in eine Datei oder etwas ausgeben würde. Mein C++ ist ein wenig eingerostet (in letzter Zeit Java und Javscript).

+0

Haben Sie schon eine BMP-Bibliothek ausgewählt? –

+0

Nein, ich bin bereit, einen von ihnen zu verwenden. Ich habe einige von ihnen durchgesehen, aber ich bin mir nicht wirklich sicher, welches ist das beste/einfachste/schnellste für so etwas. – LiverpoolFTW

+0

Ich habe hauptsächlich versucht, CImage Klasse zu verwenden. Mein Problem ist, ich weiß wirklich nicht, wie man mit der .bmp Akte interagiert. Ich brauche wirklich nur ein Beispiel, um von jemandem abzuarbeiten, vielleicht einfach so einfach, wie in eine .bmp-Datei zu gehen und eine Pixelfarbe oder etwas einzustellen. Wie ich schon sagte, es ist eine Weile her, seit ich C++ gemacht habe, also habe ich das Gefühl, dass ich mich nur verwirre, wenn ich versuche, mit der .bmp-Datei zu interagieren. – LiverpoolFTW

Antwort

4

Wenn Sie ein bekanntes BMP-Format lesen wollen und sich nicht darum kümmern, wie es gemacht wird (dh nur intern), können Sie einfach den BMP nehmen, den Header ignorieren und ihn als Pixel-Array verwenden. Es wird Zeile für Zeile beginnend unten links gespeichert. Es gibt ein paar Detailhindernisse für die Art, wie es gepackt ist, aber meiner Erfahrung nach kann ein 32bpp-Bild vollständig ignoriert werden.

Als wirklich einfaches Beispiel:

unsigned int *buffer; 
void readfile() { 
    FILE *f = fopen("file.bmp", "rb"); 
    buffer = new unsigned int[132*65]; 
    fseek(f, 54); 
    fread(buffer, 132*65*4, 1, f); 
    fclose(f); 
} 

unsigned int getpixel(int x, int y) { 
    //assuming your x/y starts from top left, like I usually do 
    return buffer[(64 - y) * 132 + x]; 
} 
+0

Das ist was ich will! aber das Problem ist, dass ich nicht weiß, wie man das syntaktisch macht ... Wie interagiere ich mit dem ersten Pixel? – LiverpoolFTW

+1

Ein Codebeispiel wurde hinzugefügt. Die 54 ist, was ich normalerweise in bmp-Dateien sehe, aber es kann für Sie anders sein, abhängig von optionalen Kopfzeilen. Zum besseren Verständnis öffnen Sie es mit einem Hex-Editor und sehen Sie selbst. – dascandy

+0

Sie sagen "beginnt unten links." und dann im Beispiel "beginnt von oben links". Könnte eine Klärung brauchen .. – Default

1

hatte ich das gleiche Problem, aber durch BMP-Dateiformat Beschreibung Lesen habe ich eine Funktion, die eine .bmp-Datei und speichert sie in einem Array liest. Vielleicht kann diese Funktion Ihnen helfen:

unsigned int PIC::BinToNum(char *b,int bytes) 
{ 
    unsigned int tmpx = 0; 
    unsigned int pw = 1; 
    for(int i=0;i<bytes;i++) 
    { 
     tmpx += ((unsigned char)b[i]* pw); 
     pw = pw * 256; 
    } 
    return tmpx; 
} 

int PIC::Open(const char *path) 
{ 
    int pad = 0; 
    unsigned int sof = 0; 
    unsigned int tx = 0; 
    char tmp[4] = {0,0,0,0}; 
    fstream file; 
    file.open(path,ios::in); 
    if(file.fail()) 
    { 
     width=height=ColorBits=size=0; 
     return -1; 
    } 
    else 
    { 
     file.seekg(0,ios::beg); 
     file.read(tmp,2); 
     if(!(tmp[0] == 66 && tmp[1] == 77)) 
     { 
      width=height=ColorBits=size=0; 
      return 0; 
     } 
     else 
     { 
      file.seekg(2,ios::beg); // 0x2 size 
      file.read(tmp,4); 
      size = BinToNum(tmp,4); 
      file.seekg(18,ios::beg); // 0x12 width 
      file.read(tmp,4); 
      width = BinToNum(tmp,4); 
      file.seekg(22,ios::beg); // 0x16 height 
      file.read(tmp,4); 
      height = BinToNum(tmp,4); 
      file.seekg(28,ios::beg); // 0x1C Bits per Pixel 
      file.read(tmp,2); 
      ColorBits = BinToNum(tmp,2); 
      file.seekg(10,ios::beg); // 0x0A start offset 
      file.read(tmp,4); 
      sof=BinToNum(tmp,4); 
      file.seekg(34,ios::beg); // 0x22 Padding 
      file.read(tmp,4); 
      pad = BinToNum(tmp,4); 
      pad = (int)(pad/height); // Compute Spacing in each row 
      pad = pad - (width*ColorBits/8); 

      // Initialize Matrix// 
      matrix = new(unsigned int[height*width]); 

      for(int h=height-1;h>=0;h--) 
      { 
       for(int w=0;w<=width-1;w++) 
       { 
        file.seekg(sof,ios::beg); 
        file.read(tmp,(int)(ColorBits/8)); 
        tx = BinToNum(tmp,(int)(ColorBits/8)); 
        matrix[(h*width)+w] = tx; 
        sof+=(int)(ColorBits/8); 
       } 
       sof +=pad; 
      } 
     } 
    } 
    file.close(); 
    return 1; 
} 


Note:This functions is member of a class that i named it "PIC"...