2015-10-27 6 views
0

Мне нужно прочитать в .bmp-файле как 2D-массив его значений оттенков серого, чтобы я мог анализировать значения каждого пикселя. Я никогда ничего не делал с файлами изображений, поэтому я понятия не имею, с чего начать. Может ли кто-нибудь предложить удобное для начинающих объяснение того, как это сделать? Все, что мне нужно, это преобразовать файл .bmp в двумерный массив целых чисел, представляющий значение оттенка серого пикселя.C++ получить массив оттенков серого из .bmp-файла

+0

Есть две части этой проблемы: 1. чтение в BMP-файле; 2. Преобразование из RGB в оттенки серого. Обе части имеют ответы здесь на StackOverflow. –

+0

Существует несколько библиотек изображений, доступных для вас, включая некоторые, которые будут конвертировать из полного цвета в оттенки серого. К сожалению, ваш вопрос в настоящее время слишком широк для StackOverflow. – dreamlax

ответ

-1
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); 
    unsigned char* dataGrayScale = new unsigned char[width*height]; 
    int counter = 0; 

    for(i = 0; i < size; i += 3) 
    { 
      dataGrayScale[i] = (data[i]+data[i+1]+data[i+2])/3 //the avg of the rgb is the grayscale value 
      counter++; 
    } 

    delete [] data; 
    return dataGrayScale; 
} 
+0

Итак, если я правильно понимаю, здесь я могу получить доступ к каждому значению пикселя из 'dataGrayScale [width * height]'? Если это так, то –

+0

Среднее значение красного, зеленого и синего каналов не обязательно означает значение оттенков серого. См. [Эту ссылку] (https://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale) для получения более подробной информации. – dreamlax

+0

-1, потому что этот код делает радикальные обобщения о входном файле (он предполагает, что вход является конкретным форматом). Он также принимает конечность главной машины. Также нет подтверждения для ввода. – dreamlax