Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 读取位图文件_C++_File_Winapi_Struct_Bitmap - Fatal编程技术网

C++ 读取位图文件

C++ 读取位图文件,c++,file,winapi,struct,bitmap,C++,File,Winapi,Struct,Bitmap,我尝试读取位图文件。这是我的节目: #include<iostream> #include<fstream> #include <string> #include<windows.h> using namespace std; #pragma pack(1) struct header { char header[2]; int32_t filesize; int16_t reser; int16_t reser1

我尝试读取位图文件。这是我的节目:

#include<iostream>
#include<fstream>
#include <string>
#include<windows.h>
using namespace std;

#pragma pack(1)
struct header
{
    char header[2];
    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()
{
    header h;
    infoheader info;
    PIxel *p;
    ifstream file("bmp2.bmp", ios::binary);
    if (file.is_open())
    {
        cout << "true" << endl;
        file.read((char*)&h, sizeof(h));
        file.read((char*)&info, sizeof(info));
        cout << info.width << " " << info.height << " " << h.filesize << " " << info.bpp << endl;
        int pa = info.width % 4;
        int size = info.width * info.height * (info.bpp / 3) + 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 = 0; i < info.height; i++)
        {
            for (int j = 0; j < info.width; j++)
            {
                p[i * info.height + j].B = *(temp++);
                p[i * info.height + j].G = *(temp++);
                p[i * info.height + j].R = *(temp++);
                //p = p + 3;
            }
            p += pa;
        }

        HWND consoleWindow = GetConsoleWindow();
        HDC hdc = GetDC(consoleWindow);
        for (int i = 0; i < info.height; i++)
        {
            for (int j = 0; j < info.width; j++)
            {
                PIxel m = p[i * info.height + j];
                SetPixel(hdc, i, j, RGB(m.R, m.G, m.B));
            }
        }
        ReleaseDC(consoleWindow, hdc);
    }
}
它可以工作,但我的控制台上的图像不正确


你能帮我把它修好吗?

我想你的填充调整错了指针。源图像上存在填充。您不希望它出现在目标图像上。用p+=pa计算填充;您应该用temp+=pa替换这一行,以说明源图像的填充。

我相信您的填充调整在错误的指针上。源图像上存在填充。您不希望它出现在目标图像上。用p+=pa计算填充;您应该将这一行替换为temp+=pa,以说明源映像的填充

上述尺寸计算不正确。每像素位数应除以8。for循环中的索引也是错误的。它最终会乘以高度x高度

也设置像素。。。i、 j。。。应更改为SetPixel。。。j、 我。。。因为在你的例子中,i指的是y轴

正如前面的回答中提到的,填充也必须固定

请注意,您可以使用LoadImage和其他Windows GDI函数打开和绘制位图

int size = (info.width * (info.bpp / 8) + pa) * info.height;
...
for(int i = info.height - 1; i >= 0; i--)
{
    for(int j = 0; j < info.width; j++)
    {
        int index = i * (info.width) + j;
        p[index].B = *(temp++);
        p[index].G = *(temp++);
        p[index].R = *(temp++);
    }
    temp += pa;
}

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));
    }
}
上述尺寸计算不正确。每像素位数应除以8。for循环中的索引也是错误的。它最终会乘以高度x高度

也设置像素。。。i、 j。。。应更改为SetPixel。。。j、 我。。。因为在你的例子中,i指的是y轴

正如前面的回答中提到的,填充也必须固定

请注意,您可以使用LoadImage和其他Windows GDI函数打开和绘制位图

int size = (info.width * (info.bpp / 8) + pa) * info.height;
...
for(int i = info.height - 1; i >= 0; i--)
{
    for(int j = 0; j < info.width; j++)
    {
        int index = i * (info.width) + j;
        p[index].B = *(temp++);
        p[index].G = *(temp++);
        p[index].R = *(temp++);
    }
    temp += pa;
}

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));
    }
}

看起来每行填充有问题。虽然您的代码似乎在使用填充;这是错误的。您希望通过填充而不是p来提高温度。p是目的地。源代码是有填充的。另外,在控制台窗口上绘制也不是一个好主意。为什么不使用BITMAPFILEHEADER、BitMapInfo Header和RGBTRIPLE呢。您可以硬编码24bpp bmp。您的代码将无法与其他bpp一起使用。为什么不使用CreateDIBSection和BitBlt呢?它附带了一个,这样我们就不必处理这些内部构件,也不必弄错它们。看起来每行填充都有问题。虽然您的代码似乎在使用填充;这是错误的。您希望通过填充而不是p来提高温度。p是目的地。源代码是有填充的。另外,在控制台窗口上绘制也不是一个好主意。为什么不使用BITMAPFILEHEADER、BitMapInfo Header和RGBTRIPLE呢。您可以硬编码24bpp bmp。您的代码将无法与其他bpp一起使用。为什么不使用CreateDIBSection和BitBlt呢?它附带了一个,这样我们就不必处理这些内部构件,也不必把它们弄错。