Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как вывести BMP попиксельно на консоль ? / 3 сообщений из 3, страница 1 из 1
29.08.2015, 18:35:58
    #39039183
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести BMP попиксельно на консоль ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
//Файл Bmp.h
#pragma once 

#include <Windows.h>
#include <iostream>
#include <fstream>

using namespace std;

extern PBYTE      BufferColor;
extern PRGBTRIPLE rgb;

void Initialize( const char *fname );
void Dispose();
void Display();
size_t GetW();
size_t GetH();




Код: plaintext
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.
//Файл Bmp.сpp

#include "Bmp.h"

static BITMAPFILEHEADER BFHeader;
static BITMAPINFOHEADER BIHeader;

PBYTE BufferColor = nullptr;

PRGBTRIPLE rgb = nullptr;

void Initialize( const char *fname )
{
	Dispose();

		ifstream in(fname, ios::in | ios::binary );

			try
			{
				if( in.fail() )
					throw "Ошибка открытия файла";

				in.read( (char*)&BFHeader, sizeof( BITMAPFILEHEADER )); 

				if( in.fail() )
					throw "Ошибка чтения файла";

				if( BFHeader.bfType != 0x4d42 )
					throw "Ошибка неверный формат файла";

				in.read( (char*)&BIHeader, sizeof( BITMAPINFOHEADER ));

				size_t SizeOfBufferColor = BIHeader.biHeight * BIHeader.biWidth;

				rgb = new RGBTRIPLE[SizeOfBufferColor]; 

				//BufferColor = new BYTE[ SizeOfBufferColor ];

				in.seekg( BFHeader.bfOffBits );

				in.read( (char*)rgb, SizeOfBufferColor*3 );

				if( in.fail() )
					throw "Ошибка чтения блока данных";
			}

			catch( const char *msg )
			{
				cout<<msg<<endl;
			}
			catch(...) {
				cerr<<"unknown error";
			}

		in.close();
}

void Dispose()
{
	memset( (LPVOID)&BFHeader, 0, sizeof( BITMAPFILEHEADER ) );
	memset( (LPVOID)&BIHeader, 0, sizeof( BITMAPINFOHEADER ) );

	if(BufferColor) {
		delete BufferColor;
		BufferColor = nullptr;
	}

	if(rgb) {
		delete rgb;
		rgb = nullptr;
	}	
}

size_t GetW() {
	return BIHeader.biWidth;
}

size_t GetH() {
	return BIHeader.biHeight;
}

void Display()
{
	cout<<"bfSize: "<<BFHeader.bfSize
		<<endl
		<<"bfType: "<<BFHeader.bfType
		<<endl
		<<"bfOffBits: "<<BFHeader.bfOffBits
		<<endl
		<<"biBitCount: "<<BIHeader.biBitCount
		<<endl
		<<"biClrImportant: "<<BIHeader.biClrImportant
		<<endl
		<<"biClrUsed: "<<BIHeader.biClrUsed
		<<endl
		<<"biCompression: "<<BIHeader.biCompression
		<<endl
		<<"biHeight: "<<BIHeader.biHeight
		<<endl
		<<"biWidth: "<<BIHeader.biWidth
		<<endl
		<<"biSize: "<<BIHeader.biSize
		<<endl;

}




Код: plaintext
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.
#include <iostream>
#include "Bmp.h"

	using namespace std;

int main( void )
{

	HWND hConsole = NULL;
	HDC  hDc      = NULL;

	Initialize( "C:\\atlas.bmp" );
	Display();

	hConsole = GetConsoleWindow();

hDc = GetDC( hConsole );

	for( int i = 0; i < GetW(); i++ )
	{
		for( int j = 0; j < GetH(); j++ )
		{
			SetPixel(hDc, j, i, RGB( rgb[i+j].rgbtRed, rgb[i+j].rgbtGreen, rgb[i+j].rgbtBlue ));
		}
	}


ReleaseDC( hConsole, hDc );

Dispose();

	return cin.get();
}
...
Рейтинг: 0 / 0
29.08.2015, 18:38:09
    #39039184
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести BMP попиксельно на консоль ?
gera3323,

картинка в 24 пикселя
...
Рейтинг: 0 / 0
30.08.2015, 12:29:56
    #39039295
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вывести BMP попиксельно на консоль ?
gera3323, это не совсем корректный исходник. От проверяет только BITMAPFILEHEADER.bftype=0x4D42.
А нужно еще проверить *INFOHEADER на разрядность цвета (1,4,8,16,24bit) и (опционально на режим сжатия).
Для индексных цветов (1,4,8) нужно инициализировать и использовать палитру.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как вывести BMP попиксельно на консоль ? / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]