2010-11-10 4 views
1

Я пытаюсь преобразовать цветной BMP-файл в BMP в масштабе шкалы. Входной бит - 24 бит, и я получаю тот же 24-бит битпм на выходе, только на этот раз в сером цвете.Преобразование цвета bmp в оттенки серого 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 после преобразования?

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

+0

Вы можете добавить свой код? как вы загружаете изображение в матрицу и выполняете этот процесс и сохраняете его? благодаря! –

ответ

6

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

+0

Большое спасибо за ответ. Это сработало. –

2

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

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

+0

Зажим должен быть ненужным в этом случае. Даже если все три компонента полномасштабны, сумма никогда не должна превышать полномасштабную (+ дробную ошибку из-за представления с плавающей запятой). Преобразование обратно в int всегда усекает к нулю. –

+0

Большое спасибо. Мне не нужно было зажимать, но делали мои RGB-каналы, поскольку RGB работал отлично !!! Большое спасибо. –

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