Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Сделать BMP чернобелым и сохранить в другой файл


Автор: BCworm 15.1.2010, 09:52
Привет всем.
С большим трудом разобрался с заголовком BMP. Получил все параметры (размер палитру и т.д.) Но встала проблема. Как сделать из цветного рисунка чернобелый grayscale и скохранить в другой файл. В графических программах это делается уменьшением насыщенности но в заголовке BMP этого нет. Как быть? 
Если я правильно понял необходимо RGB значения каждого пиксела? Но опять же как
Помогите пожалуйста.


Автор: 586 15.1.2010, 10:46
Алгоритм такой:
Код
grayColor = (R + G + B) / 3;
R = grayColor;
G = grayColor;
B = grayColor;

Автор: artsb 15.1.2010, 10:55
BCworm, поищите, мы где-то решали уже этот вопрос.

Добавлено через 7 минут и 26 секунд
Кое-что нашёл: http://forum.sources.ru/index.php?showtopic=84786&hl=%D7%C5%D0%CD%CE
Правда не у нас на форуме smile

Автор: BCworm 15.1.2010, 11:15
Спасибо большое. Ну как заменить я примерно понял чтото вроде этого 
Код

bmpheader.red = grayColor;
bmpheader.green = grayColor;
bmpheader.rblue = grayColor;


Но как потом сохранить правильно. К примеру если я открыл и считал заголовки так:
...
Код

FILE *fin,*fout;  \\fin -input    fout-output
fin = fopen("pic.bmp","rb+");
fread(&bmpheader,sizeof(bmpheader),1,fin);
bmpheader.red = grayColor;
bmpheader.green = grayColor;
bmpheader.rblue = grayColor;


то как записать
Код

..
fout=fopen("graypic.bmp","wb+");
fwrite(&bmpheader,sizeof(bmpheadere),1,fout);


Как то так?

Автор: artsb 15.1.2010, 12:00
BCworm, всё не так просто... О нюансах читайте http://ru.wikipedia.org/wiki/BMP.

Автор: BCworm 18.1.2010, 11:40
Да я читал это. Там все про те же заголовки. Если я правильно понял то нужно делать както вот так
1. Открыть файл для записи
2. Записать заголовок BMP
3. Записать палитру
4. И наконец записать битмап

Я пробовал вот так
Код

struct  head { \\это заголовок
        short bftype;
        long  bfsize;
        short rez1, rez2;
        long  bfoffbits;
        long  bisize;
        long  biwidth;
        long  biheight;
        short biplanes;
        short bibitcount;
        long  bicompression;
        long  bisizeimage;
        long  bix;
        long  biy;
        long  biclrused;
        long  biclrimp;
} head_file;

unsigned char palitra[256][4];

struct TPaletteStruct { \\это палитра
  unsigned char Red;
  unsigned char Green;
  unsigned char Blue;
 }Palette;

struct pixel{ \\это битовая карта
char R;
char G;
char B;
};


считав это все  пробую менять цвет
Код

Palette.Blue=234;
Palette.Green=54;
Palette.Red=100;


а потом записать в новый файл
Код

fout=fopen("gray.bmp","wb");
fwrite(&head_file,sizeof(head_file),1,fout);
fwrite(&Palette,sizeof(Palette),1,fout);
fwrite(&pixel,sizeof(pixel),1,fout);


Но увы файл создается и заголовок и палитра читается но изображения нет. Помогите пожалуйста уже совсем замучился smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)