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

时间:2015-01-12 03:22:11

标签: c++ bitmap edit

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

我认为我需要一个指向内存中像素数据开始位置的指针。我已经尝试了很多不同的方法,并用Google搜索了3天,但仍然无法编辑单个像素。
使用SetPixel(HDC, x, y, Color)的循环来设置每个像素,但非常慢。 我已经通过锁定位图和编辑位来在C#中实现了这一点,但我是C ++的新手,并且似乎无法弄清楚如何做类似的事情。

我大部分都在尝试使用memset(p, value, length) 对于" p"我尝试使用从CreateCompatibleBitmap返回的句柄,用于位图的DC和用于窗口的DC。我已经尝试了各种价值和长度的价值 我不确定这是否适合使用。

我不必使用位图,这是我唯一知道要做的事情。实际上找到一种直接改变主窗口DC的方法真是太棒了。 我确实想避免使用库。我这样做纯粹是为了学习C ++。

2 个答案:

答案 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咬合设置为位图,所以你应该能够使用新的位图作为参数。