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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Инкапсуляция. классы http://www.cyberforum.ru/cpp-beginners/thread989614.html
Добрый вечер. История такая: Разбирался с инкапсуляцией классов. Но не могу сформулировать точно, кратко и ёмко как всё происходит. В целом я понимаю как устроено, но в общем смысле как то не формулируется. Говорили мне что есть какая то таблица на msdn которая всё это раскрывает. Поможете?)
C++ Необычная ошибка в классе class cPolygon { public: cPolygon() : head_(0) {}; void add_dott(POINT); void Draw(TForm1*); int GetDottNum(void) {return dott_num_;}; bool GetConvex(void) {return convex;}; bool Check_all(void); http://www.cyberforum.ru/cpp-beginners/thread989612.html
код нужно сделать через указатель ! C++
# include <iostream.h> # include <conio.h> # include <stdlib.h> const int n=3, m=3; int main() {int a; int i, j, maxzn; cout<<"vvedite matricu \n"; for (i=0; i<n; i++) for (j=0; j<m; j++)
C++ Класс Point и Rectangle
*.h : class Point { public: Point(int m_x1, int m_y1); ~Point(); void InputPoint(int m_x1, int m_y1); private: int m_x;
C++ Рекурсивные функции http://www.cyberforum.ru/cpp-beginners/thread989584.html
Плиз, помогите. Ошибку выдает, а исправить как - непонятно... Пока не очень понимаю рекурсивные функции... Составить программу, используя рекурсивную функцию. Массив S содержит 10 символов. Дана строка из 120 символов. Написать программу, включающую рекурсивную функцию, которая удаляет из строки все символы, указанные в массиве S. Строка при этом “сжимается”. За первое внешнее обращение к...
C++ как переделать задачу что б были указатели ? #include <iostream.h> #include <conio.h> #include <math.h> int main () { int a , d, b; cout<<"vvedite elementu matricu"<<endl; for (int i=0; i<6; i++) for (int j=0; j<6; j++) cin>>a ; подробнее

Показать сообщение отдельно
beta-particle
 Аватар для beta-particle
4 / 4 / 0
Регистрация: 07.01.2013
Сообщений: 103
27.10.2013, 17:10     Работа с BMP изображаниями
Доброго дня суток, форумчане! Я начал писать программу чтения 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 пуст. Почему так происходит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru