Преобразование цвета BMP в оттенки серого BMP? - PullRequest
1 голос
/ 10 ноября 2010

Я пытаюсь преобразовать цветной BMP-файл в серый BMP. Входное значение bmp составляет 24 бита, и я вырабатываю те же 24-битные значения bmp на выходе, только на этот раз в оттенках серого.

Я использую код

for(int x = 0; x < max; x++)
{
    int lum;
    lum = (r[x]*0.30) + (g[x]*0.59) + (b[x]*0.11);
    r[x] = lum;
    g[x] = lum;
    b[x] = lum;
}

Массивы r, g, b являются цветовыми компонентами RGB, и у меня они есть в char *r,*g,*b.

По некоторым причинам я не получаю чистый вывод. Я прилагаю вывод, который я получаю с этим вопросом, его пятнистый и содержит белые и черные области в местах. Так что я тут не так делаю?

  1. Это из-за потери данных при вычислении lum или что-то не так в хранении int как char?
  2. Может ли bmp серой шкалы быть не 24-битным? или что-то не так в том, как я храню значения rgb после преобразования?

Любая помощь в этом будет очень ценной. Благодаря.

Ответы [ 2 ]

6 голосов
/ 10 ноября 2010

Это действительно должно быть unsigned char;если на вашей платформе подписано char, то этот код не будет работать так, как вы ожидаете.

2 голосов
/ 10 ноября 2010

Вам нужно ограничить вывод ваших вычислений в [0,255].Ваш расчет выглядит хорошо, но всегда приятно быть уверенным.

Также убедитесь, что массивы r, g, b равны unsigned char.Вы можете избежать большого количества микширования со знаком / без знака в int (из-за переполнения комплемента в 2, охватывающего ошибки), но когда вы конвертируете в float, знаки должны быть правильными.

...