Чтение растрового изображения (только 16 бит) - PullRequest
0 голосов
/ 17 апреля 2020

Это моя программа для чтения и отрисовки в файле растрового изображения консоли (только 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.

как преобразовать массив данных в массив пикселей ??

...