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头)?