Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 02.04.2019
Сообщений: 17

Работа с растрами и bmp файлом

11.12.2023, 12:55. Показов 6181. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Заданием по данному курсу является создание программы, которая открывает заданный в тексте кода файл bmp.

Для этого за образец возьмём исходный код (см.ниже). Надо взять текст кода, разобраться в нём, внести соответствующие изменения и получить exe файл. Проект создаём в Microsoft Visual Studio. Тип проекта: win32 Application.

Содержимым растра в файле, как договаривались, пускай будет собственное фото. Обязательная подпись под фото включает собственное имя и фамилию.
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
//------------------------------------------------------
//  Файл:       BMPVIEW.H
//  Описание:   Демонстрирует работу с растрами
//------------------------------------------------------
 
 
#define TIMER_ID    1
#define TIMER_RATE  500
 
char* szClassName="BMP_Window";
char* szAppName="BMP Application";
 
// Обработчики сообщений Windows
BOOL BMP_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct);
void BMP_OnDestroy(HWND hwnd);
void BMP_OnTimer(HWND hwnd, UINT id);
void BMP_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags);
void BMP_OnIdle(HWND hwnd);
 
//Оконная процедура
LRESULT CALLBACK WndProc(HWND , UINT , WPARAM, LPARAM);
 
//Вспомогательные функции
BOOL LoadBMP(HDC hdc, char* szFileName);
void ShowText(void);
 
//------------------------------------------------------
//  Файл:       BMPVIEW.CPP
//  Описание:   Демонстрирует работу с растрами
//------------------------------------------------------
 
 
#define STRICT
#define WIN32_LEAN_AND_MEAN 
 
#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include "bmpview.h"
 
//Объекты контекста в памяти и шрифт
HDC hMemDC;
HBITMAP hMemBitmap;
HFONT   hInfoFont;
 
//Два цвета для надписей
COLORREF crFontColor1;
COLORREF crFontColor2;  
 
//Имя выводимого растра
char*   szFileName="sample.bmp";
 
//Ширина и высота экрана
UINT    nScreenX;
UINT    nScreenY;
 
//Реальные ширина и высота картинки
UINT    nBmpWidth;
UINT    nBmpHeight;
 
//Ширина и высота картинки при выводе
UINT    nVBmpWidth;
UINT    nVBmpHeight;
 
//Отступ сверху для надписи
UINT    nTopDown=100;
 
 
 
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
    WNDCLASSEX wndClass;
    HWND hWnd;
    MSG msg;
 
 
    nScreenX=GetSystemMetrics(SM_CXSCREEN);
    nScreenY=GetSystemMetrics(SM_CYSCREEN);
 
    //Регистрация оконного класса
    wndClass.cbSize       =sizeof(wndClass);
    wndClass.style        =CS_HREDRAW|CS_VREDRAW;
    wndClass.lpfnWndProc  =WndProc;
    wndClass.cbClsExtra   =0;
    wndClass.cbWndExtra   =0;
    wndClass.hInstance    =hInst;
    wndClass.hIcon        =LoadIcon(NULL,IDI_WINLOGO);
    wndClass.hCursor      =LoadCursor(NULL,IDC_ARROW);
    wndClass.hbrBackground=GetStockBrush(BLACK_BRUSH);
    wndClass.lpszMenuName =NULL;
    wndClass.lpszClassName=szClassName;
    wndClass.hIconSm      =LoadIcon(NULL,IDI_WINLOGO);
 
 
    RegisterClassEx(&wndClass);
 
    //Создание окна на основе класса
    hWnd=CreateWindowEx(
        WS_EX_LEFT,//Дополнит. стиль окна
        szClassName,    //Класс окна
        szAppName,  //Текст заголовка
        WS_POPUP,   //Стиль окна
        0,0,        //Координаты X и Y
        nScreenX,nScreenY,//Ширина и высота
        NULL,       //Дескриптор родит. окна
        NULL,       //Дескриптор меню
        hInst,      //Описатель экземпляра
        NULL);      //Дополнит. данные
 
    ShowWindow(hWnd,nCmdShow);
    UpdateWindow(hWnd);
 
    //Главный цикл программы
    while (TRUE)
    {
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            if (msg.message==WM_QUIT)
                break;
            
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
            BMP_OnIdle(hWnd);
    }
    return (msg.wParam);
}
 
 
/////////////////////////////////////////////////
//  Оконная процедура
////////////////////////////////////////////////
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        HANDLE_MSG(hWnd,WM_CREATE,BMP_OnCreate);
        HANDLE_MSG(hWnd,WM_DESTROY,BMP_OnDestroy);
        HANDLE_MSG(hWnd,WM_TIMER,BMP_OnTimer);
        HANDLE_MSG(hWnd,WM_KEYDOWN,BMP_OnKey);
    default:
        return DefWindowProc(hWnd,msg,wParam,lParam);
    }
}
 
/* Обработчики сообщений */
 
BOOL BMP_OnCreate(HWND hwnd, LPCREATESTRUCT lpCreateStruct)
{
    
    HDC hTempDC;
    
    //Получаем контекст Рабочего стола
    hTempDC=GetDC(HWND_DESKTOP);
    
    //Создаём контекст в памяти и растр, совместимые с экраном
    hMemDC=CreateCompatibleDC(hTempDC);
    hMemBitmap=CreateCompatibleBitmap(hTempDC,nScreenX,nScreenY);
 
    //Заливаем содержимое контекста черным цветом
    SelectBitmap(hMemDC,hMemBitmap);
    SelectBrush(hMemDC,GetStockBrush(BLACK_BRUSH));
    PatBlt(hMemDC,0,0,nScreenX,nScreenY,PATCOPY);
    
    //Копируем картинку в контекст памяти
    if (!LoadBMP(hMemDC,szFileName))
    {
        MessageBox(hwnd,"Не найден файл","Ошибка",MB_OK|MB_ICONSTOP);
        return (FALSE);
    }
    
    //Освобождаем временный контекст
    ReleaseDC(HWND_DESKTOP,hTempDC);
    
    //Создаём шрифт и переменные для цветов шрифта
    hInfoFont=CreateFont(22,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,
        ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY,VARIABLE_PITCH,"Courier New");
 
    crFontColor1=RGB(255, 0,0);
    crFontColor2=RGB(0, 255,0);
    
    //Выбираем цвет шрифта
    SetTextColor(hMemDC,crFontColor1);
 
    //Рисуем текст в контексте памяти
    ShowText();
 
    //Устанавливаем таймер
    if (!SetTimer(hwnd,TIMER_ID,TIMER_RATE,NULL))
        return (FALSE);
    return (TRUE);
}
 
//-----------------------------------------------------------------
 
void BMP_OnDestroy(HWND hwnd)
{
    //Убираем после себя
    KillTimer(hwnd,TIMER_ID);
    DeleteDC(hMemDC);
    DeleteBitmap(hMemBitmap);
    DeleteFont(hInfoFont);
    PostQuitMessage(0);
}
 
//-----------------------------------------------------------------
 
void BMP_OnTimer(HWND hwnd, UINT id)
{
    //Рисуем текст в контексте памяти
    ShowText();
}
 
//-----------------------------------------------------------------
 
void BMP_OnIdle(HWND hwnd)
{
    HDC hWindowDC;
    //Получаем контекст окна, копируем в него содержимое
    //контекста памяти, освобождаем контекст окна
    hWindowDC=GetDC(hwnd);
    BitBlt(hWindowDC,0,0,nScreenX,nScreenY,hMemDC,0,0,SRCCOPY);
    ReleaseDC(hwnd,hWindowDC);
}
 
//-----------------------------------------------------------------
 
void BMP_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
{
    //При нажатии пробела - прекратить программу
    if (vk==VK_SPACE)
        DestroyWindow(hwnd);
}
 
//-------------------------------------------------------------------
 
/* Копирует содержимое файла BMP в контекст устройства */
 
BOOL LoadBMP(HDC hdc, char* szFileName)
{
    BYTE* pBmp;
    DWORD dwBmpSize;
    DWORD dwFileLength;
    DWORD dwBytesRead;
    
    BITMAPFILEHEADER BmpHeader;
    BITMAPINFO* pBmpInfo;
    BYTE*       pPixels;
 
    
    //Пытаемся открыть файл
    HANDLE hFile=CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    
    if (hFile==INVALID_HANDLE_VALUE)
        return (FALSE);
        
    //Определяем размер данных, которые необходимо загрузить
    dwFileLength=GetFileSize (hFile, NULL) ;
    dwBmpSize=dwFileLength-sizeof(BITMAPFILEHEADER);
 
    //Выделяем память и считываем данные
    pBmp= (BYTE*) malloc(dwBmpSize);
    ReadFile(hFile,&BmpHeader,sizeof(BmpHeader),&dwBytesRead,NULL);
    ReadFile(hFile, (LPVOID)pBmp, dwBmpSize, &dwBytesRead,NULL);
    CloseHandle(hFile);
 
    //Инициализируем указатели на информацию о картинке
    //и на графические данные
    pBmpInfo=(BITMAPINFO*)pBmp;
    pPixels=pBmp+BmpHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
 
    //Получаем ширину и высоту картинки
    nBmpHeight=pBmpInfo->bmiHeader.biHeight;
    nBmpWidth=pBmpInfo->bmiHeader.biWidth;
    
    //Вычистляем ширину и высоту картинки для вывода на экран
    nVBmpHeight=nScreenY-nTopDown*2;
    nVBmpWidth=(UINT)((double)nBmpWidth*(double)nVBmpHeight/(double)nBmpHeight);
    if (nVBmpWidth>nScreenX)
        nVBmpWidth=nScreenX;
 
 
    //Устанавливаем режим масштабирования
    SetStretchBltMode(hdc,HALFTONE);
 
    //Копируем картинку в контекст памяти
    StretchDIBits(hdc,(nScreenX-nVBmpWidth)/2,nTopDown, nVBmpWidth,nVBmpHeight,0,0,nBmpWidth,nBmpHeight,pPixels,pBmpInfo,0,SRCCOPY);
 
    //Освобождаем память
    free(pBmp);
    return (TRUE);
}
 
/* Меняет текущий цвет шрифта и выводит текст в контекст памяти*/
void ShowText()
{
    HFONT   hOldFont;
    RECT    rTextRect;
    char    szInfoText[256];
 
    //Определяем текущий цвет шрифта
    if (GetTextColor(hMemDC)==crFontColor1)
        SetTextColor(hMemDC,crFontColor2);
    else
        SetTextColor(hMemDC,crFontColor1);
    
    //Производим настройки...
    SetBkMode(hMemDC,TRANSPARENT);
    hOldFont=SelectFont(hMemDC,hInfoFont);
    
    //...и выводим текст.
    SetRect(&rTextRect,0,0,nScreenX,nTopDown);
    DrawText(hMemDC,szFileName,strlen(szFileName),&rTextRect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
 
    wsprintf(szInfoText, "Real width-%d, Real height-%d\n Virtual width-%d, Virtual height-%d",nBmpWidth,nBmpHeight,nVBmpWidth,nVBmpHeight);
    
    SetRect(&rTextRect,0,nScreenY-nTopDown,nScreenX,nScreenY);
    DrawText(hMemDC,szInfoText,strlen(szInfoText),&rTextRect,DT_CENTER);
 
    SelectFont(hMemDC,hOldFont);
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.12.2023, 12:55
Ответы с готовыми решениями:

Работа с BMP файлом
Доброго всем дня. Мне нужно сделать приложение которое будет работать с BMP рисунком. То есть суть программки приблизительно такая: 1....

Работа с BMP файлом.
Помогите, с чего начать? Требуется написать программу, которая открывает файл bmp и заменяет в нём каждый 10 байт на байты из текстового...

Работа с bmp файлом не получается найти ошибку
Добрый день, знаю что существуют разные способы считывания bmp файла, мне нужно считать таким образом что бы заголовок лежал в одном...

3
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
11.12.2023, 14:51
Цитата Сообщение от Diamonest Посмотреть сообщение
Содержимым растра в файле, как договаривались
С кем?
0
0 / 0 / 0
Регистрация: 02.04.2019
Сообщений: 17
11.12.2023, 15:17  [ТС]
С преподователем
0
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
12.12.2023, 15:29
Цитата Сообщение от Diamonest Посмотреть сообщение
С преподователем
и?
Мы рады за тебя, что тебе дали такое задание, да еще и с готовой программой. Какие всё же душевные преподы пошли! Не дают студню утонуть ни при каких обстоятельствах, диплом и лабы за него готовы писать. Совсем швах с образованием, короче. Чисто деньги плати.
Ты это хотел услышать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2023, 15:29
Помогаю со студенческими работами здесь

Работа с bmp файлом. Считывание значение пикселей в массив
Здравствуйте. Необходимо написать код который считывает из bmp картинки значение пикселей RGB в массив. Спасибо за внимание!

Работа с BMP файлом
считывание с файла в масивpublic: int *loadBMP( const char *fname, int &amp;mx, int &amp;my ) { int *v; mx = my = -1; FILE *f =...

работа с .bmp файлом
Здравствуйте, очень нужна помощь, не разу не работала с .bmp файлом(в особенности нужно как работать с пикселями этого файла), посоветуйте...

Простейшая работа с BMP-файлом
Добрый день! Только начал работать с Python, версия 3.4,разбираюсь. Пробую для начала окрасить пиксель в bmp-файле, но возникают проблемы...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru