C ++ создание образа - PullRequest
       46

C ++ создание образа

8 голосов
/ 08 декабря 2009

Я давно не программировал на C ++, и теперь мне нужно написать простую вещь, но это сводит меня с ума.

Мне нужно создать растровое изображение из таблицы цветов: char image[200][200][3];

Первая координата - ширина, вторая высота, третьи цвета: RGB. Как это сделать?

Спасибо за любую помощь. Адам

Ответы [ 5 ]

13 голосов
/ 08 декабря 2009

Я уверен, что вы уже проверили http://en.wikipedia.org/wiki/BMP_file_format.

Имея эту информацию в руках, мы можем написать быстрый BMP с:

// setup header structs bmpfile_header and bmp_dib_v3_header before this (see wiki)
// * note for a windows bitmap you want a negative height if you're starting from the top *
// * otherwise the image data is expected to go from bottom to top *

FILE * fp = fopen ("file.bmp", "wb");
fwrite(bmpfile_header, sizeof(bmpfile_header), 1, fp);
fwrite(bmp_dib_v3_header, sizeof(bmp_dib_v3_header_t), 1, fp);

for (int i = 0; i < 200; i++)  {
 for (int j = 0; j < 200; j++) {
  fwrite(&image[j][i][2], 1, 1, fp);
  fwrite(&image[j][i][1], 1, 1, fp);
  fwrite(&image[j][i][0], 1, 1, fp);
 }
}

fclose(fp);

Если проблема с настройкой заголовков, сообщите нам.

Редактировать: Я забыл, BMP-файлы ожидают BGR вместо RGB, я обновил код (удивился, что никто не поймал его).

3 голосов
/ 08 декабря 2009

Я бы предложил ImageMagick , обширную библиотеку и т. Д.

0 голосов
/ 26 февраля 2014

Для простых операций с изображениями я настоятельно рекомендую Cimg . Эта библиотека работает как шарм и чрезвычайно проста в использовании. Вам просто нужно включить заголовочный файл в ваш код. Буквально у меня ушло меньше 10 минут на компиляцию и тестирование.

Если вы хотите выполнять более сложные операции с изображениями, я бы выбрал Magick ++ , как это предлагает dagoof.

0 голосов
/ 08 декабря 2009

Было бы желательно инициализировать функцию как простой одномерный массив.

т.е. (где байты - это число байтов на пиксель)

 char image[width * height * bytes];

Затем вы можете получить доступ к соответствующей позиции в массиве следующим образом

 char byte1 = image[(x * 3) + (y * (width * bytes)) + 0];
 char byte2 = image[(x * 3) + (y * (width * bytes)) + 1];
 char byte3 = image[(x * 3) + (y * (width * bytes)) + 2];
0 голосов
/ 08 декабря 2009

Сначала я бы попытался выяснить, как определяется формат файла BMP (это то, что вы подразумеваете под растровым изображением, верно?). Затем я преобразовал бы массив в этот формат и распечатал его в файл.

Если это вариант, я бы также подумал о том, чтобы попытаться найти существующую библиотеку для создания файлов BMP и просто использовать ее.

Извините, если то, что я сказал, уже очевидно для вас, но я не знаю, на какой стадии процесса вы застряли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...