С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/41: Рейтинг темы: голосов - 41, средняя оценка - 4.98
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141

Матрица пикселей в BMP

07.01.2012, 00:10. Показов 8046. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа:
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
#include <iostream> 
#include <fstream> 
#include <cstdio>
#include <windows.h>
 
using namespace std; 
 
int main(int argc, char *argv[]) 
{ 
    setlocale(LC_ALL, "Russian");
    
    if(argc!=2) { //Если более двух аргументов командной строки
        cout << "Используй: next <имя-файла>, будь мужиком!\n"; 
        return 1; 
    } 
 
    fstream in(argv[1], ios::in | ios::out | ios::binary); 
    if(!in) { 
        cout << "Невозможно открыть файл.\n";
    } 
  
    BITMAPFILEHEADER bmpFileHeader; //Создание bmpFileHeader
    BITMAPINFOHEADER bmpInfoHeader; //Создание bmpInfoHeader
    
    in.read( (char*)&bmpFileHeader, sizeof( bmpFileHeader ) ); //Считывание данных 
    in.read( (char*)&bmpInfoHeader, sizeof( bmpInfoHeader ) ); //в структуры
    
    const int Height = bmpInfoHeader.biHeight, //Создание констант
              Width = bmpInfoHeader.biWidth,
              BpP = bmpInfoHeader.biBitCount,
              ImageSize = bmpFileHeader.bfSize;
    
    const int RowSize = BpP / 8 * Width ;
    int padding = ((24 / bmpInfoHeader.biBitCount) * Width) % 4; //Паддинг - ненужное пространсво в массиве пикселей
    char pixels_orig[Height][RowSize]; //Массив пикселей
    
    in.seekg(bmpFileHeader.bfOffBits, ios::beg); //Перескакиваем в начало массива пикселей
    
    for (int i = 0; i < Height; i++) {
        in.read(pixels_orig[i], (RowSize * (BpP / 8))); //Заполнение одного рядка
        in.seekg(padding, ios::cur); //Проскакиваем паддинг
    }
    
    cout << "Данные " << argv[1] << ":\n"
                 << "\tРазмер файла: " << ImageSize << " байтов = " << (double)ImageSize / 1024 << " килобайтов;\n"
                 << "\tШирина изображения: " << Width << " пикселей;\n"
                 << "\tВысота изображения: " << Height << " пикселей;\n"
                 << "\tБитность: " << BpP << " битов на пиксель.\n";
 
    char temp;
    
    char pixels_crypted[Height][RowSize];
    
    for (int i = 0; i < RowSize; i++)
        for (int j = 0; j < Height; j++)
            pixels_crypted[j][i] = pixels_orig[j][i];
    
    /*for (int i = 0; i < RowSize; i += 2)
        for (int j = 0; j < (Height / 2); j++) {
            temp = pixels_crypted[j][i];
            pixels_crypted[j][i] = pixels_crypted[(Height - 1) - j][i];
            pixels_crypted[(Height - 1) - j][i] = temp;
            
            //if ()
        }*/                                                                   
    
    //Создаем файл out.bmp
    
    fstream out_create("out.bmp"); 
    
    out_create.close();
    
    fstream out("out.bmp", ios::in | ios::out | ios::binary); 
    
    //Начинается запись в файл out.bmp
     
    in.seekg(0, ios::beg);
    
    char ch;
    for (int i = 1; i <= bmpFileHeader.bfOffBits; i++) {
        in.read(&ch, 1);
        out.write(&ch, 1);
    }
    
    in.close();
    
    for (int i = 0; i < Height; i++) {
        out.write(pixels_crypted[i], (RowSize * (BpP / 8))); //Заполнение одного рядка
        for (int i = 1; i <= padding; i++)
            out.write(0, 1); //Заполняем паддинг
    }
    
    out.close();
    
    return 0; 
}
Программа считывает матрицу пикселей из одного *.bmp, перемешивает их[1] и выводит их в out.bmp. Дело в том, что при выводе в файл перемешанного массива pixels_crypted программа аварийно завершает работу. Думаю, что причина в закомментированных строках кода (понятно, что при компиляции код закомментированным не был).

[1] - Возьмем матрицу, например:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}\mathbf{1} & 2 & \mathbf{3} & 4 & \mathbf{5}\\ \mathit{6} & 7 & \mathit{8} & 9 & \mathit{10}\\ 11 & 12 & 13 & 14 & 15\\ \mathit{16} & 17 & \mathit{18} & 19 & \mathit{20}\\ \mathbf{21} & 22 & \mathbf{23} & 24 & \mathbf{25}\end{bmatrix}
Из нее получится матрица:
https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}21 & 2 & 23 & 4 & 25\\ 16 & 7 & 18 & 9 & 20\\ 11 & 12 & 13 & 14 & 15\\ 6 & 17 & 8 & 19 & 10\\ 1 & 22 & 3 & 24 & 5\end{bmatrix}
Анализируем исходные данные и выходные и понимаем алгоритм перемешивания.

Вопрос: Где я накосячил в программе?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.01.2012, 00:10
Ответы с готовыми решениями:

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

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

Открыть файл формата BMP и получить значение его пикселей в виде матрицы
Дорогие программисты прошу вас помочь в следующем вопросе: мне нужно открыть в С++ файл формата BMP и получить значение его пикселей в виде...

3
 Аватар для asm
62 / 35 / 3
Регистрация: 05.10.2011
Сообщений: 137
07.01.2012, 01:39
Цитата Сообщение от Sahon Посмотреть сообщение
const int RowSize = BpP / 8 * Width ;
вот здесь RowSize обретает значение 0

Добавлено через 7 минут
поправочка: только для черно-белых BMP
0
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
07.01.2012, 19:25  [ТС]
Цитата Сообщение от asm Посмотреть сообщение
вот здесь RowSize обретает значение 0

Добавлено через 7 минут
поправочка: только для черно-белых BMP
Ну это да) Спасибо за багфикс, учту в последующих версия программы. Но вот пока я использую только 8-битные BMP.
0
 Аватар для M.t.
0 / 0 / 1
Регистрация: 10.02.2012
Сообщений: 38
05.01.2016, 17:33
Привет. Разбираю твой пример. Но все же не пойму, как загрузить картинку и что за "Будь мужиком используй next ?"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2016, 17:33
Помогаю со студенческими работами здесь

Ввод рисунка из файла *.bmp. Подсчет общего числа пикселей в строке,столбце матрицы рисунка...
На языке СИ++ написать программу,Выполняющую следующие операции: Ввод рисунка из файла *.bmp. Подсчет общего числа пикселей в...

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

Симметричную матрицу сделать несимметричной
помогите пожалуйста. условие: дана квадратичная матрица z. составить программу, которая если матрица симметричная(транспонированная...

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

Как получить массив цветов пикселей в BMP?
и как изменить цвет пикселя?


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru