| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > [С++] Запись bmp в массив |
| Автор: b26041986 28.3.2016, 01:30 |
| Помогите, пожалуйста! Как на С++ можно считать монохромный bmp файл в массив? (Нужно получить матрицу яркости. Т.е. должен получится двумерный int массив из элементов 0...255). |
| Автор: math64 28.3.2016, 10:49 |
| В какой среде программируешь? Если нужна универсальная программа - разбирайся с форматом бмп. Иначе - используй функции среды для загрузки изображения (обычно она универсальная, и подходит под любой формат) и получения отдельных пикселей (обычно получаешь 32 разрядное число, байты которого прозрачность, красный, зеленый и синий комоненты - для монохромного изображения цветовые компоненты будут одинаковыми). |
| Автор: rudolfninja 28.3.2016, 11:14 | ||||
| Я когда-то писал диссертацию на тему стеганографии, и был у меня там кусок кода, который, насколько я понял, делал то, что вам требуется. Вот код, правда, это один из чернвых вариантов, но вроде работает: Bmp.h (вам отсюда нужны структуры и метод readFromFile)
Реализация readFromFile
Код несложный, попробуйте разобраться. |
| Автор: math64 28.3.2016, 11:48 |
| Пример не учитывает возможности что пиксель может заниметь 1 байт (что логично для монохромного бмп) |
| Автор: b26041986 28.3.2016, 20:03 |
| Использую Dev-Cpp. появляется ошибка в строке ifstream input(filename, ios::in | ios::binary); Сообщение: `std::ifstream input' has initializer but incomplete type пока еще буду разбираться ... ..... м.б. для такого задания лучше использовать среду по-крупнее? |
| Автор: math64 29.3.2016, 08:15 |
| Имелось в в виду WinAPI. MFC, Qt и т. д. - у них у всех есть свои методы для работы с изображениями (хотя для Windows всё в итоге сводится к WinAPI). Вместо ifstream можно использовать <strdio.h>: FILE* input = fopen(filename, "rb"); если тебе это привычнее. Но тогда далее тоже следует использовать stdio. Учти: в 16-разрядной ОС: short - 16, int - 16, long - 32 бит в 32-разрядной ОС: short - 16, int - 32, long - 32 бит в 64-разрядной ОС: short - 16, int - 32, long - 64 бит Для какой разрядности код rudolfninja и правильно ли там определено uint ? |
| Автор: rudolfninja 29.3.2016, 08:28 |
| В 32-разрядной и в 64-разрядной ОС, насколько я понимаю, размер uint будет одинаковый. А почему нет? |
| Автор: math64 29.3.2016, 08:45 |
| rudolfninja, если бы ты написал typedef unsigned int uint32; - было бы понятно, какую ты хочешь разрядность. http://ru.cppreference.com/w/cpp/language/types т.е. при переходе WIN32->WIN64 поменяется только разрядность указателей. но в 64-разрядном Линуксе long будет 64 разрядный. |
| Автор: Hate42 30.3.2016, 10:35 |
| Спасибо |