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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка в функции поиска подстроки в строке. Алгоритм Бойера-Мура-Хорспула. http://www.cyberforum.ru/cpp-beginners/thread423736.html
Функция получает ссылки на две переменные: haystack и needle строкового типа. В haystack должна содержаться строка, в которой будет осуществлён поиск, а needle должна содержать подстроку, которую надо найти. В результате выполнения процедуры переменная функция вернёт номер позиции (при нумерации с единицы), начиная с которого подстрока needle входит в строку haystack, или 0, если вхождения нет. ...
C++ Указатели и ссылки [С++] Всем привет. я тут программу делаю. Цель: определить,принадлежит ли точка заданному промежутку(а точнее лежит внутри или снаружи фигуры). Координаты храню в массивах(по 2 значения: x и y.). Вопрос такой: можно ли создать указатель(или ссылку),который бы хранил область памяти на массив,чтобы потом им можно было манипулировать,как и массивом? к примеру: int a; int &y= a; &y = 2; &y = 5; //... http://www.cyberforum.ru/cpp-beginners/thread423728.html
C++ сумма элементов матрицы
Здравствуйте. Такая задача: В массиве А (m = n) сумму элементов над главной диагональю поделить на сумму элементов под главной диагональю. Элементы под глав-ной диагональю рассортировать по убыванию. Помогите найти суммы элементов. #include <iostream> #include <iomanip> using namespace std; int main() { setlocale(LC_ALL, "Russian");
C++ Функции (Даны три вещественные квадратные матрицы 4-го порядка)
Даны три вещественные квадратные матрицы 4-го порядка. Напечатать ту из них,норма которой наименьшая (считать, что такая матрица одна). В качестве нормы матрицы взять максимум абсолютных величин ее элементов Заранее спасибо)) пож...мне очень срочно у меня через 3 дня экзамен!
C++ Рекурсия(вычислить 1*2*3*...n+2*3*4*...(n-1)+3*4*5*(n-2)+...) http://www.cyberforum.ru/cpp-beginners/thread423661.html
дано натуральное число n. вычислить 1*2*3*...n+2*3*4*...(n-1)+3*4*5*(n-2)+... Очень срочно!! Заранее спасибо!!
C++ Оформить в циклке temp = a; temp = a; temp = a; temp = a; temp = a; temp = a; a = a; a = a; a = a; подробнее

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

Вопрос: Где я накосячил в программе?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 09:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru