2017-02-08 16 views
1

イムは、C++によって生成された:ハードコードされたビットマップ

#include <fstream> 
using std::ifstream; 
using std::ofstream; 
#include <iostream> 
using std::cout; 
using std::endl; 



int main() 
{ 
    ifstream infile ("white8x8.bmp"); 
    ofstream outfile ("output.bmp"); 
    char c; 
    cout << "Start of original read/write: " << endl; 
    for (int i = 0; i <= 53; i++) 
    { 
     infile.read (&c, 1); 
     cout << (int) c << ' ' << c; 
     outfile.write (&c, 1); 
    } 
    char z = 0; 
    char x = 0; 
    int j_prev = 0; 
    for (int i = 0; i <= 250; i++){ 
     for (int j = 0; j <= 250; j++) 
     { 

     if(j == 10){ 
      c = 0; 
      z = 0; 
      x = 0; 
      outfile.write (&c, 1); 
      outfile.write (&x, 1); 
      outfile.write (&z, 1); 
      j_prev = j; 
     } 
     /*if(j %250 == 0){ 
      c = 0; 
      z = 0; 
      x = 0; 
      outfile.write (&c, 1); 
      outfile.write (&x, 1); 
      outfile.write (&z, 1); 
     }*/ 
     else{ 
      c = 255; 
      x = 255; 
      z = 255; 
      outfile.write (&c, 1); 
      outfile.write (&x, 1); 
      outfile.write (&z, 1); 
     } 
     } 
    } 

    cout << endl << "Start of read new file: " << endl; 
    infile.close(); 
    outfile.close(); 
    ifstream out2 ("output.bmp"); 
    out2.seekg(53); 
    int count = 0; 
    for(int i = 53; i < 15000; i++){ 

    out2.read(&c, 1); 
    cout << count << ":" << (int) c << ' ' << c; 
    count++; 
    } 
    out2.close(); 
    return 0; 
} 

私はあなたがピクセルを見ることができると思うだろう配列を2次元配列として取得し、水平線を取得すると、jが特定の数値に達するたびにピクセルをプロットするだけで済みます。これはそうではないように見えるので、以下のような歪んだ線ができます。ただ、明確化のため

output.jpg

私は、単に添付画素配列を作成し、そこからそれを修正し、すでに作成したビットマップからビットマップのヘッダー情報をコピーしています。

+0

BMPは、4ピクセルの倍数にパディングする必要があります。 http://stackoverflow.com/questions/29440672/bmp-file-line-padding-issue –

+0

画像の幅が4(または8)で均等に割り切れない場合、私が覚えていることから、あなたはそれを作らなければなりませんそうでなければ、階段の効果を得ます。 – PaulMcKenzie

+2

@ RetiredNinja 4バイトではなく4バイト。 –

答えて

3

BMPファイルは、各行に対して4バイトの倍数で埋め込まれている必要があります。あなたの行は250 * 3 = 750です。これはではなく、の4の倍数です。各行の先頭で2バイトが埋められて埋め込まれ、オフセットが発生します。あなたのjループの終わりに余分な2バイトのゼロを書いてください。

+0

たぶん私はあなたを誤解しているかもしれませんが、他のブラケットの閉じ括弧の後に2バイトの0を挿入した後、画像全体に色が歪んでいるbmpで終わります。 – goetztyler

+0

@goetztyler申し訳ありませんが、私は明確ではありませんでした。私が「終わりに」と言ったとき、私は本当に*終わりの後を意味しました。 –

関連する問題