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

Считать BMP изображение в динамическую память - C++

Восстановить пароль Регистрация
 
Harrm
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
18.08.2014, 23:45     Считать BMP изображение в динамическую память #1
Нужно считать ВМР изображение в массив в динамической памяти используя fstream.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.08.2014, 23:45     Считать BMP изображение в динамическую память
Посмотрите здесь:

C++ Как применить динамическую память?
C++ Предложения в динамическую память
C++ Вопрос про динамическую память
C++ Задание на указатели и динамическую память
Зачем использовать динамическую память? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
 Аватар для Убежденный
14200 / 6215 / 986
Регистрация: 02.05.2013
Сообщений: 10,362
Завершенные тесты: 1
19.08.2014, 00:07     Считать BMP изображение в динамическую память #2
Нужно - считывайте. Не вижу проблемы.
Harrm
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
19.08.2014, 10:31  [ТС]     Считать BMP изображение в динамическую память #3
Не получается. Заголовок вроде нормально, а собственно изображение не записывается. Массив пустой.
elektron5
Заблокирован
19.08.2014, 11:15     Считать BMP изображение в динамическую память #4
Где код ?
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
19.08.2014, 11:17     Считать BMP изображение в динамическую память #5
Это скорее всего потому что массив пустой.
Покажите как вы считываете вроде заголовок и пустой массив.
Harrm
0 / 0 / 0
Регистрация: 18.08.2014
Сообщений: 9
19.08.2014, 11:36  [ТС]     Считать BMP изображение в динамическую память #6
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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main(){
 
    const unsigned short
        IMAGE_WIDTH = 72,
        IMAGE_HEIGHT = 102,
 
        FILE_HEADER_SIZE = 14,
        IMAGE_HEADER_SIZE = 40;
 
    ifstream is("image.bmp", std::ios::binary);     //Файл
 
    //У каждого файла bitmap есть заголовок из 14 байт.
    unsigned char signature[2] = { 'B', 'M' };                                              //Строка BM (в Windows).
    is.read(reinterpret_cast<char*> (signature), sizeof(signature));
    cout << "signature " << signature[0] << signature[1] << endl;
    
    unsigned int fileSize = FILE_HEADER_SIZE + IMAGE_HEADER_SIZE + IMAGE_WIDTH * IMAGE_HEIGHT * 4;  //Размер файла в байтах.
    is.read(reinterpret_cast<char*> (&fileSize), sizeof(fileSize));
    cout << "fileSize " << fileSize << endl;
    
    unsigned int reserved = 0;                                                      //Зарезервированное поле. Нужно инициализировать нулём.
    is.read(reinterpret_cast<char*> (&reserved), sizeof(reserved));
    cout << "reserved " << reserved << endl;
    
    unsigned int offset = FILE_HEADER_SIZE + IMAGE_HEADER_SIZE;                             //Адрес с которого начинается собственно изображение.
    is.read(reinterpret_cast<char*> (&offset), sizeof(offset));                             //Или по другому - смещение к началу изображения.
    cout << "offset " << offset << endl;
 
    
    //Поля заголовка Windows V3
    unsigned int headerSize = IMAGE_HEADER_SIZE;                          //Размер заголовка. Всегда задаётся 40 байт.
    is.read(reinterpret_cast<char*> (&headerSize), sizeof(headerSize));
    cout << "\n headerSize " << headerSize << endl;
    
    unsigned int dimensions[2] = { IMAGE_WIDTH, IMAGE_HEIGHT };           //Ширина и высота изображения в пикселях.
    is.read(reinterpret_cast<char*> (dimensions), sizeof(dimensions));
    cout << "dimensions " << dimensions[0] << dimensions[1] << endl;
    
    unsigned short colorPlanes = 1;                              //Данное поле всегда содержит единицу.
    is.read(reinterpret_cast<char*> (&colorPlanes), sizeof(colorPlanes));
    cout << "colorPlanes " << colorPlanes << endl;
    
    unsigned short bpp = 32;                                     //Глубина цвета - количество битов в пикселе.
    is.read(reinterpret_cast<char*> (&bpp), sizeof(bpp));
    cout << "bpp " << bpp << endl;
    
    unsigned int compression = 0;                                     //Метод сжатия.
    is.read(reinterpret_cast<char*> (&compression), sizeof(compression));
    cout << "compression " << compression << endl;
    
    unsigned int imgSize = IMAGE_WIDTH * IMAGE_HEIGHT * 4;                //Размер изображения без учёта размера заголовков.
    is.read(reinterpret_cast<char*> (&imgSize), sizeof(imgSize));         
    cout << "imgSize " << imgSize << endl;
    
    unsigned int resolution[2] = { 2795, 2795 };                          //Горизонтальное и вертикальное количество пикселей в одном метре
    is.read(reinterpret_cast<char*> (resolution), sizeof(resolution));
    cout << "resolution " << resolution << endl;
    
    unsigned int pltColors = 0;                                  //Количество цветов в палитре.
    is.read(reinterpret_cast<char*> (&pltColors), sizeof(pltColors));
    cout << "pltColors " << pltColors << endl;
    
    unsigned int impColors = 0;                                  //Количество важных цветов в палитре.
    is.read(reinterpret_cast<char*> (&impColors), sizeof(impColors));
    cout << "impColors " << impColors << endl;
 
 
    char* image = new char [dimensions[1]*dimensions[0]*4];
 
    char r = 0, g = 0, b = 0, x = 0;
 
    for (int i = 0; i < dimensions[1]; ++i)
    {
        for (int j = 0; j < dimensions[0]; ++j)
        {
            is.read(reinterpret_cast<char*>(&b), sizeof(b));
            cout << "b = " << b << endl;
            is.read(reinterpret_cast<char*>(&g), sizeof(g));
            cout << "g = " << g << endl;
            is.read(reinterpret_cast<char*>(&r), sizeof(r));
            cout << "r = " << r << endl;
            is.read(reinterpret_cast<char*>(&x), sizeof(x));
            cout << "x = " << x << endl;
 
            image[(dimensions[0] * i + j) * 4]     = b;
            image[(dimensions[0] * i + j) * 4 + 1] = g;
            image[(dimensions[0] * i + j) * 4 + 2] = r;
            image[(dimensions[0] * i + j) * 4 + 3] = 0;
        }
    }
 
    is.close();
 
    delete[] Homework_image;
    return 0;
}
Yandex
Объявления
19.08.2014, 11:36     Считать BMP изображение в динамическую память
Ответ Создать тему
Опции темы

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