当前位置:首页 > c++ > 正文内容

使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

xuwenyan2年前 (2021-04-02)c++199

学习ffmpeg时遇到一个问题,ffmpeg解码出RGB颜色后怎么绘制到屏幕上,于是将GDI、MFC_GDI、GDI+等方式都记录一下

1:注意按windows的要求,R、G、B、A顺序要调整为B、G、R、A 。

2:GDI不支持透明通道A,透明通道A的值读进去以后没有作用。想要支持透明通道,应使用GDI+方法。

GDI

void DrawBitmap(HWND hwnd, int x, int y, int nBmpWidth, int nBmpHeight,const unsigned char *pBmpData)
 {
	HBITMAP hBitmap = ::CreateBitmap(nBmpWidth, nBmpHeight, 1, 32, pBmpData);
	HDC hWndDc = ::GetDC(hwnd);
	HDC hMemDc = ::CreateCompatibleDC(hWndDc);
	HBITMAP hOldBitmap = (HBITMAP)::SelectObject(hMemDc, hBitmap);
	::BitBlt(hWndDc, x, y, nBmpWidth, nBmpHeight, hMemDc, 0, 0, SRCCOPY);
 
	::SelectObject(hMemDc, hOldBitmap);
	::DeleteObject(hBitmap);
	::DeleteDC(hMemDc);
	::ReleaseDC(hwnd, hWndDc);
}

 GDI+

#include <GdiPlus.h>
#pragma comment(lib,"Gdiplus.lib")
using namespace Gdiplus;
 

class GdiPlusInitialize
 {
	GdiplusStartupInput gdiplusStartupInput;
	ULONG_PTR gdiplusToken;
	GdiPlusInitialize()
 {
		GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
	}
	~GdiPlusInitialize()
 {
		GdiplusShutdown(gdiplusToken);
	}
	static GdiPlusInitialize Instance;
};
 
GdiPlusInitialize gdiplus_initialize_;


void DrawBitmap(HWND hwnd, int x, int y, int nBmpWidth, int nBmpHeight,unsigned char *pBmpData)
 {
	Bitmap bitmap(nBmpWidth, nBmpHeight, nBmpWidth * 4, PixelFormat32bppARGB, pBmpData);
	Graphics gps(hwnd);
	gps.DrawImage(&bitmap, x, y);
}

MFC_GDI


void DrawBitmap(CWnd *pWnd, int x, int y, int nBmpWidth, int nBmpHeight,const unsigned char *pBmpData)
 {
	CBitmap bitmap;CDC MemDc;
	bitmap.CreateBitmap(nBmpWidth, nBmpHeight, 1, 32, pBmpData);
	CDC *pWndDc = pWnd->GetDC();
	MemDc.CreateCompatibleDC(pWndDc);
	CBitmap *pOldBitmap = MemDc.SelectObject(&bitmap);
	pWndDc->BitBlt(x, y, nBmpWidth, nBmpHeight, &MemDc, 0, 0, SRCCOPY);
 
	MemDc.SelectObject(pOldBitmap);
	pWnd->ReleaseDC(pWndDc);pWndDc = NULL;
}
    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/1580

    分享给朋友:

    “使用GDI、MFC_GDI、GDI+绘制数组RGBA序列” 的相关文章

    C++创建快捷方式(lnk、url)并添加到开始菜单、桌面、任务栏

    C++创建快捷方式(lnk、url)并添加到开始菜单、桌面、任务栏

    windows快捷方式有lnk和url两种,其中lnk以打开应用程序为主,而url以打开网页链接为主。下面创建快捷方式的方法均是调用Com接口,所以一定要在调用此方法前初始化com接口(CoInitialize)。创建lnk快捷方式#include <ShlObj.h>...

    C++如何获取控制台程序的输出内容?

    C++如何获取控制台程序的输出内容?

    很多工具程序(如ffmpeg)的进度显示往往都是以控制台字符显示的方法,我们可能需要调用这种控制台工具去完成工作,但同时又希望以友好的ui界面去显示当前的工作状态(如进度)。此时我们能想到的就是运行控制台程序,然后以某种方式去获取到控制台程序的输出,然后转换到我们的ui界面上去显示。 有多种...

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    解决程序在xp系统总是莫名奇妙的崩溃问题(/Zc:threadSafeInit- )

    现象:程序在xp系统上面总是莫名其妙的崩溃,检查代码看不出任何问题,感觉代码都很好。即使你远程调试,找到了崩溃的点,当你注释了崩溃点之后,还是会崩溃到别的地方。当你遇到了这种情况的时候,不妨参照一下下面的方法看看,说不定可以解决问题。如何解决?将崩溃程序相关的所有工程代码全部关闭全局变量的线程安全检...

    ATL实现windows右键菜单扩展(ContextMenu)

    ATL实现windows右键菜单扩展(ContextMenu)

    右键菜单,即用户右击shell对象时弹出的上下文菜单(context menu)。本文记录了如何创建右键菜单的基本过程,跟着步骤一步一步来,即可创建出一个右键菜单工程。第一步,新建一个ATL工程Visual Studio—>新建项目—>ATL—>使用默认配置(一直按下一步即可)。注...

    uafxcwd.lib(afxmem.obj) : error LNK2005:

    uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法

    如果在编译MFC程序的时候出现下列及类似的错误: 1˃uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new...

    static_assert和assert有什么区别?

    static_assert和assert有什么区别?

    static_assert和assert都是断言,都可用于判断一个条件是否成立,并且在条件不成立时及时给出错误提示。那它们用什么不同和需要注意的地方呢? 1:static_assert在编译期执行,而assert在运行期执行。2:static_assert无论在debug模式还是relea...