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

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

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

Показать сообщение отдельно
Sahon
10 / 10 / 1
Регистрация: 09.04.2010
Сообщений: 141
17.01.2012, 23:21     [C++] 24-битные BMP
Программа не хочет кодировать 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; 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru