我有一个二维数据数组,我想将其显示为图像
计划是这样的 -
使用CreateCompatibleBitmap
创建一个位图(这会产生一个纯黑色位图,我可以毫无问题地显示它)
编辑此位图的像素以匹配我的数据
BitBlt位图到窗口
我认为我需要一个指向内存中像素数据开始位置的指针。我已经尝试了很多不同的方法,并用Google搜索了3天,但仍然无法编辑单个像素。
使用SetPixel(HDC, x, y, Color)
的循环来设置每个像素,但非常慢。
我已经通过锁定位图和编辑位来在C#中实现了这一点,但我是C ++的新手,并且似乎无法弄清楚如何做类似的事情。
我大部分都在尝试使用memset(p, value, length)
对于" p"我尝试使用从CreateCompatibleBitmap
返回的句柄,用于位图的DC和用于窗口的DC。我已经尝试了各种价值和长度的价值
我不确定这是否适合使用。
我不必使用位图,这是我唯一知道要做的事情。实际上找到一种直接改变主窗口DC的方法真是太棒了。 我确实想避免使用库。我这样做纯粹是为了学习C ++。
答案 0 :(得分:1)
这需要对QUITE进行一些研究,因此我将准确地发布为其他任何可能正在寻找的人做的事情。 这会将每个像素的颜色设置为红色。
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;
答案 1 :(得分:0)
memset可用于实际的RGB信息数组(但如果一个像素有32或24位,你还需要知道位图的格式。)
从对msdn的一些研究来看,你想得到的是BITMAP结构: http://msdn.microsoft.com/en-us/library/k1sf4cx2.aspx
你有可以记忆的bmBits。
如何从你的功能到达那里?
好吧,CreateCompatibleBitmap返回一个HBITMAP结构,看来你可以使用以下代码从HBITMAP获取BITMAP:
BITMAP bmp;
GetObject(hBmp, sizeof(BITMAP), &bmp);
然而,这似乎得到了现有位图信息的副本,它只解决了你的memset问题(你现在可以用memset设置位图信息,evento我看不到memeset的任何其他用途除了使bmp全部白色或黑色)。
应该有一个功能允许你将DC咬合设置为位图,所以你应该能够使用新的位图作为参数。