16 / 16 / 2
Регистрация: 28.04.2011
Сообщений: 38

Работа с BMP в Visual C++

28.04.2011, 20:56. Показов 2951. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем, кто читает это сообщение.
Пишу в большой надежде, что мне хоть кто-нибудь поможет.
Я работаю в Visual C++ и пишу программу по поиску связных областей.
Сам алгоритм простой, но я не знаю как можно добраться до матрицы пикселей в файле BMP.

Подскажите как это можно сделать, если никаких специяльных библиотек не стоит.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.04.2011, 20:56
Ответы с готовыми решениями:

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

Visual Studio не видит .bmp
Уже Довольно сильно подгорело от поисков решения этой проблемы. Может тут кто поможет? Visual Studio 2019 не видит файлы картинок на...

Сохранение .bmp файлов в Visual Basic
1)Kak mojno 'save' .bmp images v textovom faile v Visual Basic ili MS ACCESS2000? 2)Yesli mojno,to kak potom etot fail zagruzit' v...

3
14 / 14 / 2
Регистрация: 09.06.2010
Сообщений: 35
29.04.2011, 19:45
Используй WinApi для BMP, или,если хочешь что-нибудь побыстрее,то попробуй DevIL
0
16 / 16 / 2
Регистрация: 28.04.2011
Сообщений: 38
01.05.2011, 11:06  [ТС]
Получилась вот такая программка

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
#include "stdafx.h"
#include <iostream.h>
#include <windows.h>
 
unsigned int* fun(сchar* fin)
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
HANDLE hIn;
unsigned int width,
height,
position=1,
i, j;
RGBQUAD palette[256];
BYTE *inByf;
DWORD RW;
 
hIn=CreateFile(fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
 
if(hIn==INVALID_HANDLE_VALUE)
{
CloseHandle(hIn);
return NULL;
}
else
{
ReadFile(hIn, &bfh, sizeof(bfh), &RW, NULL);
ReadFile(hIn, &bih, sizeof(bih), &RW, NULL);
ReadFile(hIn, palette, 256*sizeof(RGBQUAD), &RW, NULL);
 
width=bih.biWidth;
height=bih.biHeight;
 
SetFilePointer(hIn, bfh.bfOffBits, NULL, FILE_BEGIN);
 
inBuf=new BYTE[width];
 
massiv=new unsigned int [3*height*width+1];
massiv[0]=width;
 
for(i=0; i<height; i++)
{
ReadFile(hIn, inBuf, width, &RW, NULL);
for(j=0; j<width; j++)
{
massiv[position]=palette[inBuf[j]].rgbRed;
massiv[position+1]=palette[inBuf[j]].rgbGreen;
massiv[position+2]=palette[inBuf[j]].rgbBlue;
position+=3;
}
SetFilePointer(hIn, (3*width)%4, NULL, FILE_CURRENT);
}
delete inBuf; delete massiv;
CloseHandle(hIn);
 
return;
}
}
правда она недоделанная немножко

выдаёт ошибку при создании динамического массива
undeclared identifier (необъявленный идентификатор),
не могу понять почему. Может кто подскажет?

Добавлено через 8 часов 17 минут
38.massiv=new unsigned int [3*height*width+1];

Добавлено через 2 часа 33 минуты
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
вот так лучше 
 
#include "stdafx.h"
#include <iostream.h>
#include <windows.h>
 
unsigned int* fun(char* fin)
{
BITMAPFILEHEADER bfh; // в hfh хранятся данные из блока HEADER
BITMAPINFOHEADER bih; // в bih хранятся данные из блока INFO
HANDLE hIn; // hIn - поток, в котором читается переданный файл BMP
unsigned int width, // переменная для хранения ширины растра 
height, // переменная для хранения высоты растра
position=2, // переменная, указывающая на свободное место в массиве
i, j, // переменные-счётчики для циклов for
*massiv; // массив, в котором будут храниться цвета пикселей
RGBQUAD palette[256]; // массив для хранения палитры (ТОЛЬКО ДЛЯ 256-ЦВЕТНЫХ КАРТИНОК)
BYTE *inBuf; // массив, в который будет считываться строка пикселей
DWORD RW; //
 
hIn=CreateFile(fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); // в hIn открывается переданный файл
 
if(hIn==INVALID_HANDLE_VALUE) // если возникает ошибка, то
{
CloseHandle(hIn); // закрываем поток hIn
return NULL; // и функция fun возвращает указатель равный NULL
}
else // если ошибки чтения файла не возникает
{
ReadFile(hIn, &bfh, sizeof(bfh), &RW, NULL); // прочитаем из файла блок HEADER в bfh
ReadFile(hIn, &bih, sizeof(bih), &RW, NULL); // прочитаем из файла блок INFO в bih
ReadFile(hIn, palette, 256*sizeof(RGBQUAD), &RW, NULL); // прочитаем палитру в массив palette
 
width=bih.biWidth; // ширина растра заносится в width
height=bih.biHeight; // высота растра заносится в height
 
SetFilePointer(hIn, bfh.bfOffBits, NULL, FILE_BEGIN); // читаем файл через bfh.bfOffBits от начала файла
 
inBuf=new BYTE[width]; // создаём динамический массив для хранения строки растра
massiv = new unsigned int [3*height*width+2]; // создаём динамический массив для хранения значений цветовых
//компонент пикселей
massiv[0]=width; // нулевой элемент массива хранит количество пикселей в строке
massiv[1]=height; // первый элемент массива хранит количество строк
// отсюда можно рассчитать длину массива как 3*height*width+2
for(i=0; i<height; i++) // перебираем все строки растра
{
ReadFile(hIn, inBuf, width, &RW, NULL); // читаем значения пикселей строки i в массив inBuf
for(j=0; j<width; j++)
{
massiv[position]=palette[inBuf[j]].rgbRed; // сохраняем значение красной компоненты
massiv[position+1]=palette[inBuf[j]].rgbGreen; // сохраняем значение зелёной компоненты
massiv[position+2]=palette[inBuf[j]].rgbBlue; // сохраняем значение синей компоненты
position+=3; // смещаем номер свободного элемента в массиве на 3 позиции
}
SetFilePointer(hIn, (3*width)%4, NULL, FILE_CURRENT);// начинаем читать из файла со следующей строки
}
delete inBuf; // удаляем динамический массив inBuf
CloseHandle(hIn); // закрываем поток hIn
 
return massiv; // функция fun возвращает указатель на нулевой элемент массива
}
}
0
16 / 16 / 2
Регистрация: 28.04.2011
Сообщений: 38
02.05.2011, 22:27  [ТС]
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
#include "stdafx.h"
#include <iostream.h>
#include <windows.h>
 
unsigned int fun(char* fin, char* fout, unsigned int* w, unsigned int* h)
{
BITMAPFILEHEADER bfh;            // в hfh хранятся данные из блока HEADER
BITMAPINFOHEADER bih;            // в bih хранятся данные из блока INFO
HANDLE hIn,                            // hIn - поток, в котором читается переданный файл BMP
hOut;                                     // hOut - поток, в который записывается набор пикселей
unsigned int width,                    // переменная для хранения ширины растра
height,                                    // переменная для хранения высоты растра
i, j,                                         // переменные-счётчики для циклов for
t;                                           // переменная для хранения количества пикселей
RGBQUAD palette[256];              // массив для хранения палитры
BYTE *inBuf;                            // массив, в который будет считываться растр
BYTE *outBuf;                         // массив, в который будет записываться новый растр 
DWORD RW;                             //
 
 
 
hIn=CreateFileA(fin, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 
//                                                                              в hIn открывается переданный файл
if(hIn==INVALID_HANDLE_VALUE)    // если возникает ошибка, то
return NULL;                                //  функция fun возвращает указатель равный NULL
   
hOut=CreateFileA(fout, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL);
if(hOut==INVALID_HANDLE_VALUE)    // если возникает ошибка, то
{
CloseHandle(hIn);                           // закрываем поток hIn
return 0;                                       // функция fun возвращает 0
}
else                                              // если ошибки чтения файла не возникает
{
ReadFile(hIn, &bfh, sizeof(bfh), &RW, NULL);            // прочитаем из файла блок HEADER в bfh
ReadFile(hIn, &bih, sizeof(bih), &RW, NULL);            // прочитаем из файла блок INFO в bih
ReadFile(hIn, palette, 256*sizeof(RGBQUAD), &RW, NULL); // прочитаем палитру в массив palette
SetFilePointer(hIn, bfh.bfOffBits, NULL, FILE_BEGIN);// читаем файл hIn через bfh.bfOffBits от начала
 
*w=width=bih.biWidth;                                        // ширина растра заносится в width
*h=height=bih.biHeight;                                       // высота растра заносится в height
t=width*height;                                                  // сосчитали общее количество пикселей
 
bfh.bfOffBits=sizeof(bfh)+sizeof(bih)+256*sizeof(RGBQUAD); //изменили смещение до растра на
                                                                           величину палитры
bfh.bfSize=bfh.bfOffBits+sizeof(BYTE)*t;                    // изменился общий размер файла                  
WriteFile(hOut, &bfh, sizeof(bfh), &RW, NULL);            // записали заголовок
WriteFile(hOut, &bih, sizeof(bih), &RW, NULL);             // записали блок INFO
WriteFile(hOut, palette, 256*sizeof(RGBQUAD), &RW, NULL);  // записали палитру
 
 
inBuf=new BYTE [width];                        // создан динамический массив для чтения строки пикселей
outBuf=new BYTE [width];                      // создан динамический массив для записи строки пикселей
        
for(i=0; i<height; i++)                            // перебираем все строки
{
ReadFile(hIn, inBuf, width, &RW, NULL);                 // строка занисится в inBuf
for(j=0; j<width; j++)                                         // перебираются все пиксели в строке
{
if(inBuf[j]==0) outBuf[j]=200;          // если пиксель чёрный, то заменим его на пиксель другого цвета
else                                            // если же нет, то
outBuf[j]=inBuf[j];                         // оставим
}
WriteFile(hOut, outBuf, width, &RW, NULL);          // запишем в файл изменённую строку
SetFilePointer(hIn, width, NULL, FILE_CURRENT);   // переместились в файле hIn на следующую строку
}
        
delete inBuf;                                             // удаляем динамический массив inBuf
delete outBuf;                                           // и outBuf
CloseHandle(hIn);                                       // закрываем поток hIn
CloseHandle(hOut);                                     // и hOut
return 1;                                                   // функция fun возвращает 1 , если всё верно
}
}
 
void main()
{ 
char *fin="D:\\1.bmp";
unsigned int shirina, visota;
unsigned int d=fun(fin, "D:\\rezult.bmp", &shirina, &visota);
}
 
/*
WINBASEAPI HANDLE WINAPI CreateFileA ( LPCSTR lpFileName,  DWORD dwDesiredAccess,   DWORD dwShareMode,
                                       LPSECURITY_ATTRIBUTES lpSecurityAttributes,  DWORD dwCreationDisposition,
                                       DWORD dwFlagsAndAttributes,                  HANDLE hTemplateFile          );
WINBASEAPI HANDLE WINAPI CreateFileW ( LPCWSTR lpFileName, DWORD dwDesiredAccess,   DWORD dwShareMode,
                                       LPSECURITY_ATTRIBUTES lpSecurityAttributes,  DWORD dwCreationDisposition,
                                       DWORD dwFlagsAndAttributes,                  HANDLE hTemplateFile          );
*/
Добавлено через 2 минуты
Написала похожую программку не могу понять, где ошибка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.05.2011, 22:27
Помогаю со студенческими работами здесь

Как в Visual C++ организовать вывод bmp файлов
Как в Visual C++ организовать вывод bmp файлов. Спасибо.

Как в Visual C++ организовать вывод bmp файлов
Как в Visual C++ организовать вывод bmp файлов. Спасибо.

Как создать ttf из bmp вручную (Visual C++ 6.0)?
Вообщем всё сказано в заголовке. Потом надо его зарегить в системе. Очень нужно. Буду рад любой информации. Как смогу отблагодарю.

Работа с BMP
Доброе время суток! скажу сразу, не очень силён в С++... Необходимо вытащить матрицы из которых состоит BMP (заголовочные не...

работа с BMP
задача: написать программу наложения изображений одинакового размера друг на друга, при этом из интерфейса пользователя необходимо...


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

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

Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru