C ++ Чтение и редактирование пикселей растрового изображения - PullRequest
3 голосов
/ 01 мая 2010

Я пытаюсь создать программу, которая считывает изображение (начиная с растровых изображений, потому что они самые простые), ищет в изображении определенный параметр (то есть один пиксель (255, 0, 0), за которым следует один из (0, 0, 255)) и каким-то образом изменяет пиксели (только внутри программы, не сохраняя в исходном файле.), а затем отображает его.

Я использую Windows, простой GDI для предпочтений, и я хочу избегать пользовательских библиотек только потому, что я действительно хочу понять, что я делаю для этой тестовой программы.

Кто-нибудь может помочь? В любом случае? Сайт? Совет? Пример кода?

Спасибо

Ответы [ 2 ]

4 голосов
/ 02 мая 2010

Но если под «растровым изображением» вы на самом деле подразумевали растровое изображение (то есть необработанный файл изображения, содержащий только несжатые данные пикселей), это довольно просто:

char *filename = "filename";
FILE *input = fopen(filename, "rb+");
if (!input)
{
    printf("Could not open input file '%s'\n", filename);
    system("PAUSE");
    return 1;
}

fseek(input, 0, SEEK_END);
size_t size = ftell(input);
rewind(input);

char *buffer = (char *) malloc(size);
if (!buffer)
{
    printf("Out of memory, could not allocate %u bytes\n", size);
    system("PAUSE");
    return 1;
}

if (fread(buffer, 1, size, input) != size)
{
    printf("Could not read from input file '%s'\n", filename);
    free(buffer);
    fclose(input);
    system("PAUSE");
    return 1;
}
fclose(input);

// we loaded the file from disk into memory now

for (size_t i = 0; (i + 3) < size; i += 4)
{
    if (buffer[i + 0] == 0xFF && buffer[i + 1] == 0x00 && buffer[i + 2] == 0x00 && buffer[i + 3] == 0x00)
    {
        printf("Pixel %i is red\n", (i / 4));
    }
}

free(buffer);

Извините, это стиль C, но вы можете легко изменить распределение на стиль C ++. Лично мне нравится способ чтения файлов на C, хотя. Обычно вы хотите, чтобы оператор if проверял, является ли пиксель красного цвета макросом / функцией. Это сделает оператор if наподобие «if (compare_4bytes (buffer, 0xFF000000))» ».

Также предполагается, что загруженный файл полностью состоит из необработанных данных пикселей. Если это не так, т.е. Вы читаете .bmp / ​​.png / .jpg или что-то еще, вы должны сначала загрузить, а затем преобразовать файл в памяти в необработанные данные пикселей. Это будет сделано в комментарии, говорящем «мы загрузили файл с диска в память».

BMP, безусловно, выполнимо (это уже почти необработанные пиксельные данные), но большинству других типов требуется МНОГО работы / исследований. Они часто используют сложные алгоритмы сжатия. Я предлагаю вам использовать библиотеку для этого, просто для преобразования ее в необработанные пиксельные данные.

Корона хорошая (маленькая) (http://corona.sourceforge.net/), или DevIL (http://openil.sourceforge.net/) или тысячи других:)

2 голосов
/ 01 мая 2010

Если под «растровым изображением» вы подразумеваете BMP, в Википедии есть довольно полное описание битов и байтов

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