2014-12-20 1 views
0

Я пытаюсь прочитать окрашенные 16x16 bmp, но нет 1 pixel = 3 bits (RGB). Даже если первые 4-5 строк белые, а остальные черные, документ по-прежнему заполнен 255 255 255 для каждого пикселя.Напишите небольшой бит на консоли с помощью C++

В моем случае мне нужно показать это изображение на консоли, проанализировав слои RGB каждого пикселя, но с этим много проблем.

int main() 
{ 
    FILE* f = fopen("image.bmp", "rb"); 
    unsigned char info[54]; 
    fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header 
    // extract image height and width from header 
    int width = *(int*)&info[18]; 
    int height = *(int*)&info[22]; 
    int size = 3 * width * height; 
    unsigned char * data = new unsigned char[size]; // allocate 3 bytes per pixel 
    fread(data, sizeof(unsigned char), size, f); // read the rest of the data at once 
    fclose(f); 
    for (int i = 0; i < size; i += 3) 
    { 
     unsigned char tmp = data[i]; 
     data[i] = data[i + 2]; 
     data[i + 2] = tmp; 
    } 
    unsigned int * byteData = new unsigned int[size]; 
    for (int i = 0; i <= size; i++) 
    { 
     byteData[i] = (int) data[i]; 
    } 
    for (int i = 0; i <= size/3; i++) 
    { 
     cout << i << ".\t" << byteData[i] << "\t" << byteData[i + 1] << "\t" << byteData[i + 2] << endl; 
    } 
    cout << endl; 
    cout << "=======================" << endl; 
    for (int j = 0; j < width; j++) 
    { 
     cout << j + 1 << ".\t"; 
     for (int i = 0; i < height; i++) 
     { 
      //if ((int)data[j * width + i] >= 100 && (int)data[j * width + i + 1] >= 100 && (int)data[j * width + i + 2] >= 100) 
      if (((int) data[j * width + i] + (int) data[j * width + i + 1] + (int) data[j * width + i + 2])/3 <= 170) 
       cout << " "; 
      else cout << "*"; 
     } 
     cout << endl; 
    } 
    getchar(); 
    return 0; 
} 

Как я думаю, что проблема с байт и чтения Последовательности памяти Фром мусора, но если вы могли бы объяснить, где утечка?

+0

[OT]: У вас есть 'зЬй :: VECTOR', чтобы избежать' новый [] '(и отсутствующий' удалить [] ') – Jarod42

+0

[OT]: Вы также можете использовать 'std :: swap'. – Jarod42

+0

У вас может быть проблема с выпуском и выравниванием для размера изображения. – Jarod42

ответ

0

Решение следующее: bmp должен быть создан с порядковым номером порядка 24 bpp и сверху вниз.

Правильный код для 16x16 растрового изображения:

#include <iostream> 
using namespace std; 

unsigned char* readBMP(char* filename); 
int main() 
{ 
    unsigned char * data = readBMP("winLogo.bmp"); 
    int size = 16*16*3; 
    unsigned int * byteData = new unsigned int[size]; 
    for (int i = 0; i <= size; i++) 
    { 
     byteData[i] = (int)data[i]; 
    } 
    int k = 0; 
    //uncomment to write a line of RGB values 
    //for (int i = 0; i < size; i += 3) 
    //{ 
    // cout << k+1 << ".\t" << byteData[i] << "\t" << byteData[i + 1] << "\t" << byteData[i + 2] << endl; 
    // k++; 
    //} 

    for (int i = 0; i < size; i+= 3) 
    { 
     if (i % 16*3 == 0) 
     { 
      cout << endl << (i/(16*3))+1 << ".\t"; 
     } 
     else {}; 
     if (byteData[i] >= 200 && byteData[i + 1] >= 200 && byteData[i + 2] >= 200) 
      cout << " "; 
     else 
      cout << "#"; 
    } 
    getchar(); 
    return 0; 
} 

unsigned char* readBMP(char* filename) 
{ 
    int i; 
    FILE* f = fopen(filename, "rb"); 
    unsigned char info[54]; 
    fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header 
    // extract image height and width from header 
    int width = *(int*)&info[18]; 
    int height = *(int*)&info[22]; 

    int size = -3 * width * height; 
    unsigned char* data = new unsigned char[size]; // allocate 3 bytes per pixel 
    fread(data, sizeof(unsigned char), size, f); // read the rest of the data at once 
    fclose(f); 
    //BGR -> RGB 
    for (i = 0; i < size; i += 3) 
    { 
     unsigned char tmp = data[i]; 
     data[i] = data[i + 2]; 
     data[i + 2] = tmp; 
    } 
    return data; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^