2014-12-08 3 views
2

Я пытаюсь создать растровое изображение, которое показывает траекторию полета пули.Создание растрового изображения в C

int drawBitmap(int height, int width, Point* curve, char* bitmap_name) 
{ 

    int image_size = width * height * 3; 
    int padding = width - (width % 4); 

    struct _BitmapFileheader_ BMFH; 
    struct _BitmapInfoHeader_ BMIH; 

    BMFH.type_[1] = 'B'; 
    BMFH.type_[2] = 'M'; 
    BMFH.file_size_ = 54 + height * padding; 
    BMFH.reserved_1_ = 0; 
    BMFH.reserved_2_ = 0; 
    BMFH.offset_ = 54; 

    BMIH.header_size_ = 40; 
    BMIH.width_ = width; 
    BMIH.height_ = height; 
    BMIH.colour_planes_ = 1; 
    BMIH.bit_per_pixel_ = 24; 
    BMIH.compression_ = 0; 
    BMIH.image_size_ = image_size + height * padding; 
    BMIH.x_pixels_per_meter_ = 2835; 
    BMIH.y_pixels_per_meter_ = 2835; 
    BMIH.colours_used_ = 0; 
    BMIH.important_colours_ = 0; 

    writeBitmap(BMFH, BMIH, curve, bitmap_name); 

    } 

void* writeBitmap(struct _BitmapFileheader_ file_header, 
    struct _BitmapInfoHeader_ file_infoheader, void* pixel_data, char* file_name) 
{ 
    FILE* image = fopen(file_name, "w"); 

    fwrite((void*)&file_header, 1, sizeof(file_header), image); 
    fwrite((void*)&file_infoheader, 1, sizeof(file_infoheader), image); 
    fwrite((void*)pixel_data, 1, sizeof(pixel_data), image); 
    fclose(image); 

    return 0; 

} 

Кривая - это возвращаемое значение функции, которая вычисляет путь. Он указывает на массив точек, который представляет собой структуру координат x и y. Я действительно не знаю, как правильно «поместить» данные в растровое изображение. Недавно я начал программировать C, и сейчас я совсем потерялся.

+0

Для начала, файл .bmp использует малое форматирование конца. Так, например, первые два символа 'B' и 'M' фактически находятся в порядке «M», «B». Каждое поле следует за тем же самым маленьким форматированием. Таким образом, оператор присваивания в коде может или не может привести к правильному порядку байтов поля, в зависимости от базового оборудования. – user3629249

+0

при использовании структуры, в которой разные поля имеют различный размер, будут добавлены байты заполнения между определенными полями, если необходимо, для выравнивания следующего поля с соответствующей границей адреса. Это дополнение (не имеет никакого отношения к заполнению строки изображения, чтобы каждая строка была кратной 4) приведет к недопустимому файлу .bmp. Для достижения правильного порядка байтов и добавления дополнений к компилятору правильным методом является определение структур как групп байтов (char) и размещение каждого байта отдельно. – user3629249

+1

@ user3629249 'BMFH.type_' выглядит как массив, поэтому идентификатор« BM » байты * являются * правильным путем. Но индексы массива ошибочны. Должен быть 'BMFH.type_ [0] = 'B'; BMFH.type_ [1] = «M»; « –

ответ

1

Вы уже знаете, что занимаете какое-либо место в каждой строке пикселя, но я вижу проблему в ваших расчетах. Каждая строка пикселей должна иметь номер length % 4 == 0. Таким образом, с 3 байта на пиксель (24-бит)

length = ((3 * width) + 3) & -4; // -4 as I don't know the int size, say 0xFFFFFFFC 

Посмотрите структуру растрового изображения - возможно, у вас уже есть. Объявите (или выделите) размер байта изображения размером height * length и заполните его нулями. Проанализируйте траекторию пули и найдите диапазон координат x и y. Увеличьте их до размера растрового изображения width и height. Теперь снова проанализируйте траекторию пули, масштабируя координаты до xx и yy и напишите три 0xFF байт (вы указали 24-битный цвет) в правильное место в массиве для каждой позиции маркера.

if (xx >= 0 && xx < width && yy >= 0 && yy < height) { 
    index = yy * length + xx * 3; 
    bitmap [index]  = 0xFF; 
    bitmap [index + 1] = 0xFF; 
    bitmap [index + 2] = 0xFF; 
} 

Наконец, сохраните информацию растрового изображения, данные заголовка и изображения в файл. Когда это сработает, вы можете улучшить свое использование цвета.

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