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

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

Войти
Регистрация
Восстановить пароль
 
beta-particle
4 / 4 / 0
Регистрация: 07.01.2013
Сообщений: 103
#1

Работа с BMP изображаниями - C++

27.10.2013, 17:10. Просмотров 758. Ответов 2
Метки нет (Все метки)

Доброго дня суток, форумчане! Я начал писать программу чтения 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
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
134
135
136
137
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h>
 
 
using namespace std;
 
typedef struct tagRGBTriplet
{
    BYTE red;
    BYTE green;
    BYTE blue;
} RGBTriplet;
 
BYTE* LoadBMP ( int* width, int* height, long* size, LPCTSTR bmpfile )
{
    // declare bitmap structures
    BITMAPFILEHEADER bmpheader;
    BITMAPINFOHEADER bmpinfo;
    // value to be used in ReadFile funcs
    DWORD bytesread;
    // open file to read from
    HANDLE file = CreateFile ( bmpfile , GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, /*FILE_FLAG_SEQUENTIAL_SCAN*/0, NULL );
    if ( NULL == file )
        return NULL; // coudn't open file
    
    
    // read file header
    if ( ReadFile ( file, &bmpheader, sizeof ( BITMAPFILEHEADER ), &bytesread, NULL ) == false )
    {
        CloseHandle ( file );
        return NULL;
    }
 
    //read bitmap info
 
    if ( ReadFile ( file, &bmpinfo, sizeof ( BITMAPINFOHEADER ), &bytesread, NULL ) == false )
    {
        CloseHandle ( file );
        return NULL;
    }
    
    // check if file is actually a bmp
    if ( bmpheader.bfType != 'MB' )
    {
        CloseHandle ( file );
        return NULL;
    }
 
    // get image measurements
    *width   = bmpinfo.biWidth;
    *height  = abs ( bmpinfo.biHeight );
 
    // check if bmp is uncompressed
    if ( bmpinfo.biCompression != BI_RGB )
    {
        CloseHandle ( file );
        return NULL;
    }
 
    // check if we have 24 bit bmp
    if ( bmpinfo.biBitCount != 24 )
    {
        CloseHandle ( file );
        return NULL;
    }
    
 
    // create buffer to hold the data
    *size = bmpheader.bfSize - bmpheader.bfOffBits;
    BYTE* Buffer = new BYTE[ *size ];
    // move file pointer to start of bitmap data
    SetFilePointer ( file, bmpheader.bfOffBits, NULL, FILE_BEGIN );
    // read bmp data
    if ( ReadFile ( file, Buffer, *size, &bytesread, NULL ) == false )
    {
        delete [] Buffer;
        CloseHandle ( file );
        return NULL;
    }
 
    // everything successful here: close file and return buffer
    
    CloseHandle ( file );
 
    return Buffer;
}
 
 
BYTE* ConvertBMPToRGBBuffer ( BYTE* Buffer, int width, int height )
{
    // first make sure the parameters are valid
    if ( ( NULL == Buffer ) || ( width == 0 ) || ( height == 0 ) )
        return NULL;
 
    // find the number of padding bytes
        
    int padding = 0;
    int scanlinebytes = width * 3;
    while ( ( scanlinebytes + padding ) % 4 != 0 )     // DWORD = 4 bytes
        padding++;
    // get the padded scanline width
    int psw = scanlinebytes + padding;
 
    // create new buffer
    BYTE* newbuf = new BYTE[width*height*3];
    
    // now we loop trough all bytes of the original buffer, 
    // swap the R and B bytes and the scanlines
    long bufpos = 0;   
    long newpos = 0;
    for ( int y = 0; y < height; y++ )
        for ( int x = 0; x < 3 * width; x+=3 )
        {
            newpos = y * 3 * width + x;     
            bufpos = ( height - y - 1 ) * psw + x;
 
            newbuf[newpos] = Buffer[bufpos + 2];       
            newbuf[newpos + 1] = Buffer[bufpos+1]; 
            newbuf[newpos + 2] = Buffer[bufpos];     
        }
 
    return newbuf;
}
 
int main(){
 
    int x,y;
    long size;
    BYTE* Buffer = LoadBMP(&x,&y,&size,"C:\\Users\\Артур\\Desktop\\1.bmp");
    RGBTriplet* buffer = (RGBTriplet*)ConvertBMPToRGBBuffer( Buffer, x, y );
    cout << buffer;
 
    return 0;
}
Но при окончании программы, оказывается, что Buffer пуст. Почему так происходит?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2013, 17:10     Работа с BMP изображаниями
Посмотрите здесь:

Работа с BMP файлом. - C++
Помогите, с чего начать? Требуется написать программу, которая открывает файл bmp и заменяет в нём каждый 10 байт на байты из текстового...

Работа с картинками BMP - C++
Как проверить рисунок типа BMP на количество цветов?

Скриншот, работа с bmp - C++
Возникла необходимость создания скриншота неактивого окна. В результате долгих поисков, по гуглу я наткнулся на следующий рабочий код: ...

Работа с bmp изображением - C++
Всем привет! Интересует вопрос:Каким образом можно считать bmp изображение в матрицу, изменить его(аля инстаграмм), а затем сохранить в...

Работа с файлами BMP формата - C++
Привет. Такая ситуация... Нужно считать (именно &quot;вручную&quot;) файл bmp формата в объект класса. При этом если в объект ничего не считано то он...

Работа с bmp файлом не получается найти ошибку - C++
Добрый день, знаю что существуют разные способы считывания bmp файла, мне нужно считать таким образом что бы заголовок лежал в одном...

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

bmp 8 - C++
Помогите пожалуйста, нужно реализовать алгоритм Линде-Бузо-Грея для BMP файла. Проблема появляется при записи файла в формат bmp 8 -...

bmp в C++ - C++
Помогите пожалуйста написать программу на C++ которая уменьшает разрешение bmp картинки в 2 раза. Можно использовать только библиотеку ...

BMP - файл - C++
Доброго времени суток ! Друзья, где можно почитать про BMP файлы, посмотреть примеры (код) ? Интересует: как изменить яркость. ...

Считывание bmp - C++
Здравствуйте, мне надо считать изображение, содержащая только 2х цветную палитру, и просканировать картинку на наличие черных пикселей,...

bmp (24 битный) - C++
Ребят всем привет я бы выложил тут код,ну на самом деле с моей точки зрения это не к чему.Встала задача открыть 24 битный bmp файл и...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
27.10.2013, 17:30     Работа с BMP изображаниями #2
Цитата Сообщение от beta-particle Посмотреть сообщение
Но при окончании программы, оказывается, что Buffer пуст. Почему так происходит?
Это тебя следует об этом спросить, ведь именно ты писал эту программу.
Цитата Сообщение от beta-particle Посмотреть сообщение
Я начал писать программу чтения BMP-шки в массив. Вот ее код:
Какая функция работает не так как надо?
beta-particle
4 / 4 / 0
Регистрация: 07.01.2013
Сообщений: 103
27.10.2013, 17:35  [ТС]     Работа с BMP изображаниями #3
castaway,
я подозреваю, что это происходит где-то здесь.
C++
1
2
3
BYTE* Buffer = new BYTE[ *size ];
    // move file pointer to start of bitmap data
    SetFilePointer ( file, bmpheader.bfOffBits, NULL, FILE_BEGIN );
Yandex
Объявления
27.10.2013, 17:35     Работа с BMP изображаниями
Ответ Создать тему
Опции темы

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