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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
07.01.2012, 00:10     Матрица пикселей в BMP #1
Программа:
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] - Возьмем матрицу, например:
http://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}
Из нее получится матрица:
http://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}
Анализируем исходные данные и выходные и понимаем алгоритм перемешивания.

Вопрос: Где я накосячил в программе?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 00:10     Матрица пикселей в BMP
Посмотрите здесь:

Сохранение пикселей в графический формат файла C++
C++ GetPixel Сканирование область пикселей
C++ Картинка в виде двумерного массива пикселей
C++ Создание круга радиусом 10 пикселей в случайной области
C++ Работа с BMP-файлами (класс "8 битное BMP изображение)
Ввод рисунка из файла *.bmp. Подсчет общего числа пикселей в строке,столбце матрицы рисунка... C++
Работа с bmp файлом. Считывание значение пикселей в массив C++
C++ Найти координаты всех пикселей образующих прямую
C++ Массив пикселей
C++ Двумерный массив пикселей
Из массива пикселей сформировать bmp изображение C++
Как записать цвета всех пикселей картинки в массив C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asm
 Аватар для asm
62 / 35 / 1
Регистрация: 05.10.2011
Сообщений: 137
07.01.2012, 01:39     Матрица пикселей в BMP #2
Цитата Сообщение от Sahon Посмотреть сообщение
const int RowSize = BpP / 8 * Width ;
вот здесь RowSize обретает значение 0

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

Добавлено через 7 минут
поправочка: только для черно-белых BMP
Ну это да) Спасибо за багфикс, учту в последующих версия программы. Но вот пока я использую только 8-битные BMP.
M.t.
 Аватар для M.t.
0 / 0 / 0
Регистрация: 10.02.2012
Сообщений: 33
05.01.2016, 17:33     Матрица пикселей в BMP #4
Привет. Разбираю твой пример. Но все же не пойму, как загрузить картинку и что за "Будь мужиком используй next ?"
Yandex
Объявления
05.01.2016, 17:33     Матрица пикселей в BMP
Ответ Создать тему
Опции темы

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