Форум программистов, компьютерный форум CyberForum.ru

8-битное BMP изображение - C++

Восстановить пароль Регистрация
 
compl
1 / 1 / 0
Регистрация: 23.10.2012
Сообщений: 70
04.05.2013, 19:22     8-битное BMP изображение #1
Нужно закрасить bmp изображение в цвета российского флага. Пока получилось только красный цвет, а как сделать еще и синий?
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
typedef unsigned short int  word; 
typedef unsigned int        dword;
#pragma pack(push)
#pragma pack(1)
//рисунок 213*154=32802. Откуда 34342 ? 213%4=3 3*154(число строк)=462 462+32802=33264(размер картинки)
struct BitMapHeader
{
    word    bfType;             // тип файла, для BMP - BM 
    dword   bfSize;             // размер файла - dword (истинный размер 34342-1078+14)
    word    bfReserved1;        // не используется 
    word    bfReserved2;        // не используется 
    dword   bfOffbits;          // смещение данных битового образа от заголовка в байтах (1078) 
 
    // Далее идет структура BITMAPINFOHEADER 
    
    dword   biSize ;            // число байт, занимаемых структурой  BITMAPINFOHEADER 
    dword   biWidth;            // ширина витового образа в пикселях
    dword   biHeight;           // высота битового образа в пикселях
    word    biPlanes;           // число битовых плоскостей устройства
    word    biBitCount;         // число битов на пиксель 
    dword   biCompression;      // тип сжатия 
    dword   biSizeImage;        // размер картинки в байтах (без 1078 т.е.33264)
    dword   biXPelPerMeter;     // горизонтальное разрешение устройства, пиксель/м 
    dword   biYPelPerMeter;     // вертикальное разрешение устройства,  пиксель/м 
    dword   biClrUsed;          // число используемых цветов 
    dword   biClrImportant;     // число "важных" цветов 
};
 
typedef unsigned char       BYTE;
 
#pragma pack(pop)
 
struct tagRGBQUAD {
        BYTE    rgbBlue;
        BYTE    rgbGreen;
        BYTE    rgbRed;
        BYTE    rgbReserved;
} ;
 
BitMapHeader ReadHeader(FILE * f);
void ReadQuad(tagRGBQUAD* RGB,int biSize,FILE *f);
void WriteQuad(tagRGBQUAD* RGB,int biSize,FILE *f);
 
int main(int argc, char* argv[])
{
    BitMapHeader header;
    tagRGBQUAD RGBQuad[256];
    BYTE c;
    BYTE d;
    FILE* fb;   
    char filename[]="1.bmp";
    int i;
    if(!(fb=fopen(filename,"r+b"))){printf("file not open");return 1;}
 
    // заголовок
    header=ReadHeader(fb);
 
    // некоторые важные размеры
    printf("size of picture (biSizeImage)= %d\n",header.biSizeImage);
    printf("bfsize=%d\n",header.bfSize);
    printf("size of header+Quad (bfOffbits)= %d\n",header.bfOffbits);
    printf("size of header (biSize+14)= %d\n",header.biSize+14);
 
    // палитра
    ReadQuad(RGBQuad,header.biSize+14,fb);
    int n;
    int m;
    n=header.biHeight/3;
    m=header.biWidth;
    for(int i=0;i<256;i++)
        if(RGBQuad[i].rgbBlue==0 && RGBQuad[i].rgbGreen==0 && RGBQuad[i].rgbRed==255)
        {
            c=i;
            
            //break;
        }
 
    BYTE *a=new BYTE [n*m];
    for(i=0;i<n*m;i++)
        a[i]=c;
 
    fseek(fb,header.bfOffbits,SEEK_SET);
    fwrite(a,n*m,1,fb);
    c=255;
    for(i=0;i<n*m;i++)
        a[i]=c;
    fseek(fb,n*m,SEEK_CUR);
        fwrite(a,n*m,1,fb);
    delete[]a;
 
    WriteQuad(RGBQuad,header.biSize+14,fb);
    fclose(fb);
    return 0;
}
BitMapHeader ReadHeader(FILE * f)
{
    BitMapHeader h;
    int numread;
    fseek(f,0,SEEK_SET);
    if(!(numread=fread(&h,sizeof(BitMapHeader),1,f)))exit(1);
    return h;
}
    
void ReadQuad(tagRGBQUAD* RGB,int biSize,FILE *f)
{
    fseek(f,biSize,SEEK_SET);
    fread(RGB,1024,1,f);
}
 
 
 
void WriteQuad(tagRGBQUAD* RGB,int biSize,FILE *f)
{
    fseek(f,biSize,SEEK_SET);
    fwrite(RGB,1024,1,f);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2013, 19:22     8-битное BMP изображение
Посмотрите здесь:

Увеличить BMP изображение в два раза C++
Не записывает в файл (увеличить bmp изображение в 2 раза) C++
C++ Работа с BMP-файлами (класс "8 битное BMP изображение)
Вывести множество цифр, входящих в изображение числа N, которые не входят в изображение числа M C++
C++ Считать BMP изображение в динамическую память
160 битное значение, представляющее целое число, конвертировать в string в десятичном представлении C++
C++ Как содать 64-битное приложение?
Как записать 64-битное число в два 32 битных C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 12:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru