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

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

Восстановить пароль Регистрация
 
beta-particle
 Аватар для beta-particle
4 / 4 / 0
Регистрация: 07.01.2013
Сообщений: 103
27.10.2013, 17:10     Работа с BMP изображаниями #1
Доброго дня суток, форумчане! Я начал писать программу чтения 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++
C++ Работа с BMP файлом.
C++ Скриншот, работа с bmp
C++ Работа с bmp изображением
C++ Работа с BMP-файлами (класс "8 битное BMP изображение)
Работа с bmp файлом. Считывание значение пикселей в массив C++
C++ bmp 8
Работа с bmp файлом не получается найти ошибку C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
27.10.2013, 17:30     Работа с BMP изображаниями #2
Цитата Сообщение от beta-particle Посмотреть сообщение
Но при окончании программы, оказывается, что Buffer пуст. Почему так происходит?
Это тебя следует об этом спросить, ведь именно ты писал эту программу.
Цитата Сообщение от beta-particle Посмотреть сообщение
Я начал писать программу чтения BMP-шки в массив. Вот ее код:
Какая функция работает не так как надо?
beta-particle
 Аватар для 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 изображаниями
Ответ Создать тему
Опции темы

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