Это моя программа для чтения и отрисовки в файле растрового изображения консоли (только 16 бит)
#include<iostream>
#include<fstream>
#include <string>
#include<windows.h> using namespace std;
#pragma pack(1) struct header {
int16_t header;
int32_t filesize;
int16_t reser;
int16_t reser1;
int32_t dataoffset; };
struct infoheader {
int32_t headersize;
int32_t width;
int32_t height;
int16_t plans;
int16_t bpp;
int32_t compression;
int32_t datasize;
int32_t re;
int32_t ve;
int32_t color;
int32_t importantcolor; };
struct PIxel {
unsigned char G;
unsigned char B;
unsigned char R; };
int main() {
cout << 1 << " ";
header h;
infoheader info;
PIxel* p;
ifstream file("bmp1.bmp", ios::binary);
if (file.is_open())
{
cout << "true" << endl;
file.read((char*)&h, sizeof(h));
if (h.header == 0x4D42)
{
cout << 1 << endl;
file.read((char*)&info, sizeof(info));
int pa = info.width % 4;
int size = info.width * info.height * 2 + pa * info.height;
char* arr = new char[size];
file.read(arr, size);
char* temp = arr;
int sizep = info.height * info.width;
p = new PIxel[sizep];
for (int i = info.height - 1; i >= 0; i--)
{
for (int j = 0; j < info.width; j++)
{
// code //
}
temp += pa;
}
HWND consoleWindow = GetConsoleWindow();
HDC hdc = GetDC(consoleWindow);
for (int i = 0; i < info.height; i++)
{
for (int j = 0; j < info.width; j++)
{
int index = i * info.width + j;
PIxel m = p[index];
SetPixel(hdc, j, i, RGB(m.R, m.G, m.B));
// SetPixel(hdc,j,i,)
}
}
ReleaseDC(consoleWindow, hdc);
}
else
{
cout << 0;
}
} }
, потому что каждый цветовой канал занимает 5 бит, поэтому я не могу использовать temp ++ как этот (в 24 битах)
#include<iostream>
#include<fstream>
#include <string>
#include<windows.h> using namespace std;
#pragma pack(1) struct header {
int16_t header;
int32_t filesize;
int16_t reser;
int16_t reser1;
int32_t dataoffset; };
struct infoheader {
int32_t headersize;
int32_t width;
int32_t height;
int16_t plans;
int16_t bpp;
int32_t compression;
int32_t datasize;
int32_t re;
int32_t ve;
int32_t color;
int32_t importantcolor; };
struct PIxel {
unsigned char G;
unsigned char B;
unsigned char R; };
int main() {
cout << 1<<" ";
header h;
infoheader info;
PIxel* p;
ifstream file("bmp3.bmp", ios::binary);
if (file.is_open())
{
cout << "true" << endl;
file.read((char*)&h, sizeof(h));
if (h.header == 0x4D42)
{
cout << 1 << endl;
file.read((char*)&info, sizeof(info));
int pa = info.width % 4;
int size = info.width * info.height * (info.bpp / 8) + pa * info.height;
char* arr = new char[size];
file.read(arr, size);
char* temp = arr;
int sizep = info.height * info.width;
p = new PIxel[sizep];
for (int i = info.height - 1; i >= 0; i--)
{
for (int j = 0; j < info.width; j++)
{
//like this
int index = i * info.width + j;
p[index].B = *(temp++);
p[index].G = *(temp++);
p[index].R = *(temp++);
}
temp += pa;
}
HWND consoleWindow = GetConsoleWindow();
HDC hdc = GetDC(consoleWindow);
for (int i = 0; i < info.height; i++)
{
for (int j = 0; j < info.width; j++)
{
int index = i * info.width + j;
PIxel m = p[index];
SetPixel(hdc, j, i, RGB(m.R, m.G, m.B));
// SetPixel(hdc,j,i,)
}
}
ReleaseDC(consoleWindow, hdc);
}
else
{
cout << 0;
}
} }
Каждый цветовой канал принимает 5 битов значения пикселя, в то время как старший значащий бит (MSB) равен 0.
как преобразовать массив данных в массив пикселей ??