Чтение BMP 32 бит - PullRequest
       99

Чтение BMP 32 бит

0 голосов
/ 18 апреля 2020

Я пытаюсь прочитать файл растрового изображения (32 бита). Это моя программа:

#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;
    unsigned char A;
};





int main()
{
    cout << 1 << " ";
    header h;
    infoheader info;
    PIxel* p;
    string name;
    getline(cin, name);

    ifstream file(name, 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));
            cout << info.width << " " << info.height << " " << h.filesize << " " << info.bpp << endl;
           // int pa = 3;
            cout << info.bpp << endl;
            int size = info.width * info.height * info.bpp / 8 ;
            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++)
                {
                    //temp++;
                    int index = i * info.width + j;
                    p[index].A = *(temp++);
                    p[index].B = *(temp++);
                    p[index].G = *(temp++);
                    p[index].R = *(temp++);


                }
             // temp += 1;
            }


            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.A,m.R, m.G, m.B));


                }
            }
            ReleaseDC(consoleWindow, hdc);
        }
        else
        {
            cout << 0;
        }
    }
}

Это работает, но изображение на моей консоли не правильно ... enter image description here Входное изображение: enter image description here

Я не знаю, какова реальная роль альфы, добавить прозрачность в растровые изображения не так просто, как кажется. Прозрачные растровые изображения поддерживаются не всеми приложениями. Можете ли вы помочь мне исправить это и объяснить реальную роль альфы?

...