С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

[C++] 24-битные BMP - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Практическая работа по классам http://www.cyberforum.ru/cpp-beginners/thread430263.html
Построить систему классов для описания плоских геометрических фигур: круг, квадрат, треугольник. Предусмотреть методы для создания объектов, перемещение на плоскости, изменения размеров и вращения на...
C++ Сделать задачу на C++ Помогите сделать задачу? Задача на применение функций: Выступление спортсмена оценивают N арбитров (число N>=3!). Во избежание необъективности судейства высшую и низшую оценки отбрасывают и находят... http://www.cyberforum.ru/cpp-beginners/thread430258.html
Массив и функция C++
Товарищи, если Вам не тяжело- помогите пожалуйста, собственно надо составить 2 программы в кротчайшие сроки, точнее- к завтрашнему дню. Прошу прощения, что в виде изображения, дело в том, что не знаю...
перегрузка операторов C++
Описать класс, реализующий указанный ниже тип данных. Класс должен содержать множество конструкторов для создания объектов определенного типа (конструктор по замачиванию и с параметрами, конструктор...
C++ Классы и объекты http://www.cyberforum.ru/cpp-beginners/thread430247.html
Создать объявление класса и разработать программу-драйвер, который продемонстрирует работу класса. Клас Cylinder (циліндр). Клас має атрибути radius (радіус) і height (висота), кожний з яких за...
C++ Потоковый ввод-вывод Написать программу, которая будет добавлять в текстовый файл введенную с клавиатуры информацию Следует предусмотреть возможность выбора пользователем режима работы: добавление или отображения данных.... подробнее

Показать сообщение отдельно
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141

[C++] 24-битные BMP - C++

17.01.2012, 23:21. Просмотров 1978. Ответов 30
Метки (Все метки)

Программа не хочет кодировать 24-битные BMP. Под кодированием я понимаю разбитие изображение на квадраты по 10 пикселей (в программе - по 10 байтов, но это не особо существенно потому, что само изображение выходное открываться не хочет), при котором сначала квадраты перемешиваются по вертикали, а потом и по горизонтали. Пример,
1 6 11 16
2 7 12 17
3 8 13 18 =>
4 9 14 19
5 10 15 20

5 6 15 16
4 7 14 17
3 8 13 18 =>
2 9 12 19
1 10 11 20

16 15 6 5
4 7 14 17
18 13 8 3
19 12 9 2
20 11 10 1

P.S. 8-битные битмапы шифруются на ура.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream> 
#include <fstream> 
#include <cstdio>
#include <windows.h>
#include <cstring>
 
using namespace std; 
 
int main(int argc, char *argv[]) 
{ 
    setlocale(LC_ALL, "Russian");
    
    if(argc!=2) { //Если более двух аргументов командной строки
        cout << "Используй: next <имя-файла>, будь мужиком!\n"; 
    } 
 
    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; //Паддинг - ненужное пространсво в массиве пикселей
    
    if (BpP == 8)
        padding = (3 * Width) % 4;
    else if (BpP == 16)
        padding = (2 * Width) % 4;
    else if (BpP == 24)
        padding = 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];
    
    const int code = 10;
    
    for (int i = 0; i < RowSize; i++)
        for (int j = 0; j < Height; j++)
            pixels_crypted[j][i] = pixels_orig[j][i];
    
    //////////////////////  
    //////////////////////      
    ////Новый алгоритм////
    //////////////////////
    //////////////////////
    
    char pattern_1[10][10],
         pattern_2[10][10];
    
    for (int i = 0; i < (Height - Height % 10) / 2 ; i += 10)
        for (int j = 0; j < RowSize - RowSize % 10; j += 20) {
            for (int i_mod_1 = 0; i_mod_1 < 10; i_mod_1++)
                for (int j_mod_1 = 0; j_mod_1 < 10; j_mod_1++) {
                    pattern_1[i_mod_1][j_mod_1] = pixels_crypted[i + i_mod_1][j + j_mod_1];
                    pattern_2[i_mod_1][j_mod_1] = pixels_crypted[Height - Height % 10 - 10 - i + i_mod_1][j + j_mod_1];
                }
                
            for (int i_mod_2 = 0; i_mod_2 < 10; i_mod_2++)  
                for (int j_mod_2 = 0; j_mod_2 < 10; j_mod_2++) {
                    pixels_crypted[i + i_mod_2][j + j_mod_2] = pattern_2[i_mod_2][j_mod_2];
                    pixels_crypted[Height - Height % 10 - 10 - i + i_mod_2][j + j_mod_2] = pattern_1[i_mod_2][j_mod_2];
                }
        }   
    
    for (int i = 0; i < Height - Height % 10 ; i += 20)
        for (int j = 0; j < (RowSize - RowSize % 10) / 2; j += 10) {
            for (int i_mod_1 = 0; i_mod_1 < 10; i_mod_1++)
                for (int j_mod_1 = 0; j_mod_1 < 10; j_mod_1++) {
                    pattern_1[i_mod_1][j_mod_1] = pixels_crypted[i + i_mod_1][j + j_mod_1];
                    pattern_2[i_mod_1][j_mod_1] = pixels_crypted[i + i_mod_1][RowSize - RowSize % 10 - 10 - j + j_mod_1];
                }
                
            for (int i_mod_2 = 0; i_mod_2 < 10; i_mod_2++)  
                for (int j_mod_2 = 0; j_mod_2 < 10; j_mod_2++) {
                    pixels_crypted[i + i_mod_2][j + j_mod_2] = pattern_2[i_mod_2][j_mod_2];
                    pixels_crypted[i + i_mod_2][RowSize - RowSize % 10 - 10 - j + j_mod_2] = pattern_1[i_mod_2][j_mod_2];
                }
        }   
        
    //Создаем файл out.bmp
    fstream out_create("out.bmp", ios::out); 
    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); //Заполнение одного рядка
        for (int j = 1; j <= padding; j++)
            out.put(0); //Заполняем паддинг
    }
    
    out.close();
    
    return 0; 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.