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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.71
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
#1

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

07.01.2012, 00:10. Просмотров 3301. Ответов 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] - Возьмем матрицу, например:
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}
Анализируем исходные данные и выходные и понимаем алгоритм перемешивания.

Вопрос: Где я накосячил в программе?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2012, 00:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Матрица пикселей в BMP (C++):

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

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

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

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

дана квадратичная матрица z[n][n]. составить программу, которая если матрица симметричная(транспонированная матрица равна исходной), сделает ее не сим - C++
помогите пожалуйста. условие: дана квадратичная матрица z. составить программу, которая если матрица симметричная(транспонированная...

Массив пикселей - C++
Хочу работать с графикой, попробовал различные библиотеки, но сейчас хочу создать что-то свое. Поэтому вопрос: как создать массив пикселей?...

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

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

Добавлено через 7 минут
поправочка: только для черно-белых BMP
Ну это да) Спасибо за багфикс, учту в последующих версия программы. Но вот пока я использую только 8-битные BMP.
0
M.t.
0 / 0 / 0
Регистрация: 10.02.2012
Сообщений: 38
05.01.2016, 17:33 #4
Привет. Разбираю твой пример. Но все же не пойму, как загрузить картинку и что за "Будь мужиком используй next ?"
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2016, 17:33
Привет! Вот еще темы с ответами:

Двумерный массив пикселей - C++
Всем доброго времени суток! Ниже представлен код, который берет картинку разбивает ее на двумерный массив пикселей,а затем выдает этот...

Поиск пикселей в изображении - C++
В общем ситуация такая: нужно получить скрин экрана и найти координаты пикселей определённого цвета, к примеру белого. И это должно...

Считывание пикселей в игре - C++
Всем добрый день. Загорелся идеей сделать следущее: программу, которая в популярной игре CS 1.6 будет сканировать игровую область и при...

GetPixel Сканирование область пикселей - C++
Здрасте :) Проблемма состоит в том что функция, то работает, то не работает... Задача функции, нужно просканировать целую область...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
05.01.2016, 17:33
Ответ Создать тему
Опции темы

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