powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как вывести BMP попиксельно на консоль ?
3 сообщений из 3, страница 1 из 1
Как вывести BMP попиксельно на консоль ?
    #39039183
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Как вывести BMP попиксельно на консоль ?
    #39039184
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323,

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


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