비트 맵 파일 읽기

게시 된 복구

비트 맵 파일을 읽으려고합니다. 이 내 프로그램 :

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

작동하지만 콘솔의 이미지가 올바르지 않습니다 ...

영상

문제를 해결하도록 도와 줄 수 있습니까?

바르 막 셰미 라니
int size = info.width * info.height * (info.bpp / 3) + pa * info.height; 

위의 크기 계산은 올바르지 않습니다. 픽셀 당 비트는 8로 나누어야합니다. for 루프의 인덱싱도 잘못되었습니다. 높이 x 높이를 곱하면 끝납니다.

또한 SetPixel(... i, j ...)변경되어야 SetPixel(... j, i ...)보낸 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));
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

비트 맵 이미지 파일에서 픽셀 데이터 값 읽기

분류에서Dev

캔버스 크기 및 비트 맵 파일 크기 조정

분류에서Dev

DatagridView에서 Tiff 비트 맵 파일 만들기

분류에서Dev

Android의 Parse에서 비트 맵 읽기

분류에서Dev

C ++에서 "비트 맵"픽셀 읽기

분류에서Dev

해시 맵 문제로 파일 읽기

분류에서Dev

파일 읽기의 EOF 비트

분류에서Dev

C ++ 비트 맵 파일 저장

분류에서Dev

IDL 64 비트에서 32 비트 dll 파일 읽기

분류에서Dev

Android 자르기 비트 맵

분류에서Dev

텍스트 파일 읽기

분류에서Dev

텍스트 파일 읽기

분류에서Dev

스파크 창의 비트 맵 가져 오기

분류에서Dev

R-히트 맵에 사용할 html / json 맵 파일 가져 오기

분류에서Dev

다른 활동에서 비트 맵 읽기-> 빈 이미지

분류에서Dev

비트 맵으로 타일링하여 배경 채우기

분류에서Dev

일부 정보로 비트 맵 오버레이 만들기

분류에서Dev

캔버스의 일부를 비트 맵으로 가져 오기

분류에서Dev

ifstream이 파일의 int를 맵 C ++로 읽어 오기

분류에서Dev

CSV 파일을 해시 맵으로 읽기

분류에서Dev

C ++ 파일에서 맵으로 내용 읽기

분류에서Dev

파일에서 비트 필드 구조 쓰기 / 읽기

분류에서Dev

비디오 파일 읽기 및 쓰기

분류에서Dev

비동기 적으로 파일 읽기

분류에서Dev

Python : 텍스트 파일에서 맵 (튜플) 만들기

분류에서Dev

비트 맵 이미지를 저장하기 위해 60ms마다 c로 파일 생성

분류에서Dev

robots.txt 파일에서 사이트 맵 URL 텍스트를 읽는 방법

분류에서Dev

robots.txt 파일에서 사이트 맵 URL 텍스트를 읽는 방법

분류에서Dev

바둑판 식 비트 맵 / 반복 비트 맵 가져 오기

Related 관련 기사

뜨겁다태그

보관