C++ 使用C+在内存中编辑位图+;

C++ 使用C+在内存中编辑位图+;,c++,bitmap,edit,C++,Bitmap,Edit,我有一个二维数据数组,我想将其显示为图像。 计划是这样的- 使用CreateCompatibleBitmap创建位图(这将生成一个纯黑色位图,我可以毫无问题地显示它) 编辑此位图的像素以匹配我的数据 BitBlt将位图添加到窗口 我想我需要一个指向内存中像素数据开始位置的指针。我已经尝试了很多不同的方法,在谷歌上搜索了3天,但仍然无法编辑一个像素。 使用SetPixel(HDC,x,y,Color)循环设置每个像素,但速度非常慢。 我已经在C语言中通过锁定位图和编辑位来完成这一点,但是我对C++

我有一个二维数据数组,我想将其显示为图像。
计划是这样的-
使用
CreateCompatibleBitmap
创建位图(这将生成一个纯黑色位图,我可以毫无问题地显示它)
编辑此位图的像素以匹配我的数据
BitBlt将位图添加到窗口

我想我需要一个指向内存中像素数据开始位置的指针。我已经尝试了很多不同的方法,在谷歌上搜索了3天,但仍然无法编辑一个像素。
使用
SetPixel(HDC,x,y,Color)
循环设置每个像素,但速度非常慢。 我已经在C语言中通过锁定位图和编辑位来完成这一点,但是我对C++是新的,而且似乎不知道如何做类似的事情。 我一直在尝试使用
memset(p,value,length)
对于“p”,我尝试使用从
CreateCompatibleBitmap
返回的句柄、位图的DC和窗口的DC。我尝试了各种各样的值和长度。
我不确定这是否是正确的使用方法

我不必使用位图,这只是我知道要做的唯一一件事。事实上,找到一种直接改变主窗口的DC的方法是非常棒的。
不过我确实想避开图书馆。我这样做纯粹是为了学习C++。

MeMSET可以用于实际的RGB信息数组(但是如果你有一个像素有32或24位,你也需要知道位图的格式)。 通过对msdn的一点研究,似乎您想要得到的是位图结构:

这里有bmBits,您可以在其上设置memset

如何从你的功能中到达那里

CreateCompatibleBitmap返回一个HBITMAP结构,您似乎可以使用以下代码从HBITMAP获取位图:

BITMAP bmp;
GetObject(hBmp, sizeof(BITMAP), &bmp); 
然而,这似乎得到了现有位图信息的一个副本,这只解决了您的memset问题(您现在可以使用memset设置位图信息,尽管我看不到memeset除了使bmp全为白色或黑色之外还有任何其他用途)


应该有一个函数,允许您将DC比特设置为位图,这样您就可以使用新位图作为参数。

这需要进行大量的研究,因此我将为可能正在查看的任何其他人详细介绍如何进行此操作。 这使每个像素都变成红色

hDC = BeginPaint(hWnd, &Ps);

    const int
        width = 400,
        height = 400,
        size = width * height * 3;
    byte * data;
    data = new byte[size];
    for (int i = 0; i < size; i += 3)
    {
        data[i] = 0; 
        data[i + 1] = 0;
        data[i + 2] = 255;
    }

    BITMAPINFOHEADER bmih;
    bmih.biBitCount = 24;
    bmih.biClrImportant = 0;
    bmih.biClrUsed = 0;
    bmih.biCompression = BI_RGB;
    bmih.biWidth = width;
    bmih.biHeight = height;
    bmih.biPlanes = 1;
    bmih.biSize = 40;
    bmih.biSizeImage = size;

    BITMAPINFO bmpi;
    bmpi.bmiHeader = bmih;
    SetDIBitsToDevice(hDC, 0, 0, width, height, 0, 0, 0, height, data, &bmpi, DIB_RGB_COLORS);
    delete[] data;
hDC=BeginPaint(hWnd和Ps);
常数整数
宽度=400,
高度=400,
尺寸=宽度*高度*3;
字节*数据;
数据=新字节[大小];
对于(int i=0;i
首先准备像素数据,然后使用
CreateDIBSection
创建位图。或者完全绕过位图,直接从数据缓冲区使用
setdibittodevice
进行渲染。但是,如果出于某种原因坚持修改现有位图,则有
SetDIBits
这是非常有用的信息,我将开始实施它。我仍然很好奇是否有一种方法可以逐像素改变内存中的位图,就像编写我自己的SetDIBits函数一样。或者这会有点太难吗?如果你的意思是“逐像素”,那么在我看来,你主要是在学习低级C Windows API。可能有用,可能很有趣,但肯定不是C++。至少不是21世纪c++为什么要硬编码40而不是使用sizeof(BitMapInfo头)?