首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将CreateDIBSection BMP数据写入文件

将CreateDIBSection BMP数据写入文件
EN

Stack Overflow用户
提问于 2015-11-29 22:05:39
回答 1查看 380关注 0票数 0

我已经采取了一个程序截图,我想写BGRA文件。BGRA在pixelBuffer举行。

下面是我用来编写文件的代码:

代码语言:javascript
复制
    BYTE *pixelBuffer;
    HBITMAP hbmp;
    hbmp = CreateDIBSection(hdcScreen, &bmi, DIB_RGB_COLORS, (void **)&pixelBuffer, NULL, 0);


FILE *stream;\
if (fopen_s(&stream, "C:\\Users\Vayeate\\Desktop\\blah.txt", "wb+") == 0) {
    fwrite(pixelBuffer, (screenHeight * screenWidth * 4), (size_t)(sizeof(CHAR) + 1), stream); // (screenWidth * screenHeight * 4)
    fclose(stream);
}

然而,这写了一堆看起来像:

代码语言:javascript
复制
òîîÿòîîÿ

永远重复。我希望能得到一些类似255, 100, 100, 255的东西。

这是我的完整代码:

代码语言:javascript
复制
#include <Windows.h>
#include <stdio.h>

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, int)
{
    //Sleep(1000)

    MessageBox(0, L"Hello World", L"Unipen", MB_ICONINFORMATION);


    int i = 0;
    DISPLAY_DEVICE device;

    device.cb = sizeof(device);


    while (EnumDisplayDevices(NULL, i, &device, 0) && ++i) {
        if ((device.StateFlags & DISPLAY_DEVICE_ACTIVE) != DISPLAY_DEVICE_ACTIVE) {
            MessageBox(0, device.DeviceName, L"CONTINUE", MB_ICONINFORMATION);
            continue;
        }
        MessageBox(0, device.DeviceName, L"BREAK", MB_ICONINFORMATION);
        break;
    }

    size_t screenWidth = 1920;
    size_t screenHeight = 1200;
    size_t colorLen = 4;

    HDC hdcScreen;
    hdcScreen = CreateDC(NULL, device.DeviceName, NULL, NULL);
    if (hdcScreen == (HDC)NULL) {
        MessageBox(0, L"UnableToCreateDC", L"ERROR", MB_ICONINFORMATION);
        return 0;
    }

    HDC hdcMemoryDC;
    hdcMemoryDC = CreateCompatibleDC(hdcScreen);
    if (hdcMemoryDC == (HDC)NULL) {
        DeleteDC(hdcScreen);
        MessageBox(0, L"UnableToCreateCompatibleDC", L"ERROR", MB_ICONINFORMATION);
        return 0;
    }

    BITMAPINFO bmi;
    bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth = (LONG)screenWidth;
    bmi.bmiHeader.biHeight = (-1)*(LONG)screenHeight;
    bmi.bmiHeader.biPlanes = 1;
    bmi.bmiHeader.biBitCount = 32;
    bmi.bmiHeader.biCompression = BI_RGB;

    BYTE *pixelBuffer;
    HBITMAP hbmp;
    hbmp = CreateDIBSection(hdcScreen, &bmi, DIB_RGB_COLORS, (void **)&pixelBuffer, NULL, 0);
    if (hbmp == (HBITMAP)NULL) {
        DeleteDC(hdcScreen);
        DeleteDC(hdcMemoryDC);
        MessageBox(0, L"UnableToCreateDIBSection", L"ERROR", MB_ICONINFORMATION);
        return 0;
    }

    //HGDIOBJ rez_selected;
    HBITMAP rez_selected_bmp;
    rez_selected_bmp = (HBITMAP)SelectObject(hdcMemoryDC, hbmp);
    if (rez_selected_bmp == (HBITMAP)NULL) {
        DeleteDC(hdcScreen);
        DeleteDC(hdcMemoryDC);
        DeleteObject(hbmp);
        MessageBox(0, L"UnableToCreateDIBSection", L"ERROR", MB_ICONINFORMATION);
        return 0;
    }

    BitBlt(hdcMemoryDC, 0, 0, screenWidth, screenHeight, hdcScreen, 0, 0, SRCCOPY);


    //(void) SelectObject(hdcMemoryDC, rez_selected_bmp); // i dont do this step in nativeshot

    FILE *stream;\
    if (fopen_s(&stream, "C:\\Users\Vayeate\\Desktop\\blah.txt", "wb+") == 0) {
        fwrite("asdfasdfasdf", 1, (size_t)(sizeof(CHAR) + 1), stream); // (screenWidth * screenHeight * 4)
        fclose(stream);
    }

    DeleteDC(hdcScreen);
    DeleteDC(hdcMemoryDC);
    DeleteObject(hbmp);

    MessageBox(0, L"DONE", L"Unipen", MB_ICONINFORMATION);

    return 0;
}

如何使空格分隔的BGRA数据文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 22:23:32

您正在编写二进制数据并将其作为文本读取。因此,顺便说一句,òîîÿòîîÿ可能是正确的输出,因为根据显示它的文本编辑器使用的字符映射,这些是二进制值映射到的字符。

如果要将缓冲区中像素的空格分隔值写入文本文件,则必须首先使用fprintf对这些值进行相应的转换。

以此为例:

代码语言:javascript
复制
if (fopen_s(&stream, "C:\\Users\Vayeate\\Desktop\\blah.txt", "w") == 0) {
    for(size_t px = 0 ; px < (screenHeight * screenWidth * 4) ; ++px) {
        fprintf(stream, "%hhu, ", pixelBuffer[px]);
    }
    fclose(stream);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33988703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档