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

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

Войти
Регистрация
Восстановить пароль
 
Алекс92
0 / 0 / 0
Регистрация: 17.06.2011
Сообщений: 16
#1

bmp файл.Яркость (C++) - C++

09.12.2013, 22:40. Просмотров 461. Ответов 2
Метки нет (Все метки)

Здравствуйте.Подскажите пожалуйста. Имеется программа для получения 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
#include <windows.h>
#include <tchar.h>
#define  DIB_RGB(r, g, b) \
((DWORD)((r & 0xFF) << 16) | ((g & 0xFF) << 8) | (b & 0xFF)) 
 
void fill_rect(__int32*, int, int, int, int, int, DWORD);
 
 
 
 
 
// 24/32 бит
BOOL  SaveArrFile(const TCHAR* filename, const __int32* arr, 
                         int width, int height, int bpp = 24){
 
    if((bpp < 24) || (bpp > 32)) // только 24/32 бит
         return FALSE;
 
    DWORD p_row = (DWORD)((width * bpp + 31) & ~31) / 8uL;
    DWORD size  = (DWORD)(height * p_row);
 
    // формируем файловый заголовок
    BITMAPFILEHEADER  hdr;
    ZeroMemory(&hdr, sizeof(BITMAPFILEHEADER));
    hdr.bfType    = 0x4D42;
    hdr.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    hdr.bfSize    = hdr.bfOffBits + size;
 
    // заголовок описателя растра
    BITMAPINFO dib;
    ZeroMemory(&dib, sizeof(BITMAPINFO));
    dib.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
    dib.bmiHeader.biBitCount  = bpp;
    dib.bmiHeader.biCompression  = BI_RGB;
    dib.bmiHeader.biPlanes  = 1u;
    dib.bmiHeader.biWidth   = (long)width;
    dib.bmiHeader.biHeight  = (long)-height;
    dib.bmiHeader.biSizeImage   = size;
    dib.bmiHeader.biXPelsPerMeter = 11811L;
    dib.bmiHeader.biYPelsPerMeter = 11811L;
    dib.bmiHeader.biClrImportant  = 0uL;
    dib.bmiHeader.biClrUsed  = 0uL;
 
    // далее запись в файл
    HANDLE fp = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, 
                                   CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(fp == INVALID_HANDLE_VALUE)
           return FALSE;
 
    // записываем заголовки...
    DWORD  dwr = 0uL;
    WriteFile(fp, (LPCVOID)&hdr, sizeof(BITMAPFILEHEADER), &dwr, NULL);
    WriteFile(fp, (LPCVOID)&dib.bmiHeader, sizeof(BITMAPINFOHEADER), &dwr, NULL);
 
    // запись массива пикселей
    if(bpp == 32) // 32-бит
           WriteFile(fp, (LPCVOID)arr, size, &dwr, NULL);
    else if(bpp == 24) { // 24-бит с дополнением до 32-разрядной границы
 
          BYTE   nil = 0u;
          int   cb  = sizeof(RGBQUAD);
          int  align = ((cb - ((width*bpp + 7) / 8) % cb) % cb);
        
          for(int y = 0; y < height; y++) {
               for(int x = 0; x < width; x++) 
                    WriteFile(fp, (LPCVOID)&arr[y*width+x], sizeof(RGBTRIPLE), &dwr, NULL);
            
                    for(int i = 0; i < align; i++) // до границы DWORD
                          WriteFile(fp, (LPCVOID)&nil, sizeof(BYTE), &dwr, NULL);
               }
   }
 
   FlushFileBuffers(fp);
   CloseHandle(fp);
   return TRUE;
}
 
 
 
 
 
int  main(void) {
    //массив пикселей
    __int32 arr[111*222] = {0};
    int cw = 222; 
    int ch = 111;
 
    // нарисуем что-нибудь
    DWORD rgb;
    int   sx  = ch / 5;
    int   sy  = cw / 10;
    for(int y = 0; y < 5; y++) {
         for(int x = 0; x < 10; x++) {
              rgb = DIB_RGB(rand()%2*0xFF, rand()%2*0xFF, rand()%2*0xFF);
              fill_rect(arr, cw, x*sx, y*sy, sx, sy, rgb);
        }
    }
 
 
    // сохраняем в файл
    if(SaveArrFile(_T("grid.bmp"), arr, cw, ch, 24))
           _putts(_T("Good save file."));
    else
           _putts(_T("Error save file !"));
 
    _gettchar();
    return 0;
}
 
 
 
// вывод прямоугольника
void fill_rect(__int32* arr, int width, int x, int y, int cx, int cy, DWORD color){
     for(int r = y; r <= (y + cy); r++) {
          for(int c = x; c <= (x + cx); c++)
               arr[r*width + c] = color;
     }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2013, 22:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос bmp файл.Яркость (C++) (C++):

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

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

Конвертировать bmp файл в txt - C++
Необходимо написать программу для конвертации монохромного bmp файла, в файл txt, где содержимое будет в виде ascii кодов в 16- ричном...

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

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

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

2
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
10.12.2013, 12:32 #2
В этом коде яркость нигде отдельно не задается.
1
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
10.12.2013, 12:44 #3
Код не смотрел, но зная примерно структуру файла формата bmp, думаю он считывает значение каждого пикселя и потом воспроизводит. А каждый пиксель задается просто тремя байтами Red Green Blue, соответственно яркость определяет само изображение.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2013, 12:44
Привет! Вот еще темы с ответами:

Не могу найти ошибку в коде. BMP файл, поворот на 90 - C++
Здрасти ! Друзья, помогите найти ошибку: Задача /* Написать программу, формирующую по исходному BMP файлу новый BMP файл, повернутый на...

Сделать скриншот экрана и сохранить в файл формата jpg или bmp - C++
Приветствую, товарищи. Необходимо сделать скриншот экрана и сохранить в файл формата jpg или bmp. У кого какие предложения? Мой...

Обработка матрицы, каждый элемент которой задает яркость пикселя изображения - C++
Матрица, каждый элемент которой является уровнем интенсивности пикселя некоторого изображения, представлена в текстовом файле, адрес...

bmp 8 - C++
Помогите пожалуйста, нужно реализовать алгоритм Линде-Бузо-Грея для BMP файла. Проблема появляется при записи файла в формат bmp 8 -...


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

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

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