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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
compl
1 / 1 / 0
Регистрация: 23.10.2012
Сообщений: 70
#1

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

04.05.2013, 19:22. Просмотров 469. Ответов 0
Метки нет (Все метки)

Нужно закрасить 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 изображение (C++):

Работа с BMP-файлами (класс "8 битное BMP изображение) - C++
Написать класс &quot;8 битное BMP изображение&quot;.Класс должен содержать 3 конструктора: конструктор по умолчанию, конструктор с параметрами и...

Увеличить BMP изображение в два раза - C++
Дано задание увеличить 8-битное BMP изображение в два раза. Функцию реализовать в классе. После некоторых размышлений получился сий код=)...

Считать BMP изображение в динамическую память - C++
Нужно считать ВМР изображение в массив в динамической памяти используя fstream.

Из массива пикселей сформировать bmp изображение - C++
Добрый день. Имеется массив пикселей char*, из которого необходимо сформировать bmp изображение. В массиве пиксел представлен 12-ти...

Не записывает в файл (увеличить bmp изображение в 2 раза) - C++
Дано задание увеличить bmp изображение в 2 раза. Написал программу, которая по идее, должна делать сие действие (все в классе), но записи в...

Как преобразовать изображение BMP в черно-белое и не только? - C++
Здравствуйте! В общем стоит задача сделать консольный фото редактор, который выполнял бы ряд задач. Не без помощи гугла, часть из них я...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2013, 19:22
Привет! Вот еще темы с ответами:

Написать функцию, которая принимает 32 битное целое число и возвращает 16 битное целое число - C++
Помогите написать программу, использующую функцию, которая принимает 32 битное целое число и возвращает 16 битное целое число, состоящее из...

Надо сгенерировать 8-битное значение - C++
В моей программе мне нужно сгенерировать 8-байтовое целочисленное значение. Я попробовал сделать так... unsigned long long element =...

Как содать 64-битное приложение? - C++
Как застваить компилятор создавать приложение, использующее все возможности x64? Недавно купил себе процессор Intel Pentium i5 x64....

Как записать 64-битное число в два 32 битных - C++
В программе с++ нужно сделать вставку на ассемблере в этой втсавке буду работать с 64 битным числом, но 64 битных регистров нет, ну или я...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru