2017-02-08 10 views
1

Im пытаются выяснить, как рисовать прямые вертикальные линии в жестко закодированы растровый файл генерируется через с ++:Hard-кодированный растровый в 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

BMPs должен быть дополнен кратным 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, то есть не a кратное 4; 2 байта поглощаются для заполнения в начале каждой строки, что приводит к смещению. Просто напишите дополнительные 2 байта нулей в конце вашего цикла j.

+0

Возможно, я недопонимаю вас, но после вставки 2 байтов нулей после закрывающей скобки скобки else я заканчиваю bmp с искаженными цветами по всему изображению? – goetztyler

+0

@goetztyler жаль, что я не был ясен. Когда я сказал «в конце», я действительно имел в виду * после окончания. –