首页 > 编程语言 >C++与C#创建位图,是否需要区分RGB和BGR模式

C++与C#创建位图,是否需要区分RGB和BGR模式

时间:2024-07-02 20:28:44浏览次数:3  
标签:C# RGB C++ System BGR API Drawing

在处理位图时,确实需要区分RGB和BGR模式,因为不同的库和API对颜色通道的排序有不同的约定。具体到C++与C#,这一点也是需要注意的。

C++ 创建位图

  • 使用GDI+或WIC (Windows Imaging Component): 当你在C++中使用这些Windows API创建或操作位图时,通常会指定像素格式,比如PixelFormat24bppRGBPixelFormat24bppBGR。这意味着你需要根据API的要求明确指定是RGB还是BGR。例如,GUID_WICPixelFormat24bppBGR明确指定了BGR顺序。

  • OpenCV: 如果你使用OpenCV处理图像,其默认的颜色顺序是BGR,所以即使你处理的是RGB图像,也需要考虑颜色通道的转换。

C++中创建位图的方法更加多样化,取决于你是否使用托管代码(如C++/CLI)或原生代码。

使用C++/CLI(托管代码)

类似于C#,在C++/CLI中也可以使用.NET FrameworkSystem.Drawing命名空间来创建位图,语法非常接近C#,如之前所示。

使用原生C++库(非托管代码)

  1. GDI+: 如之前示例,使用Windows的GDI+库创建位图。这种方法提供了跨平台之外的替代方案,但仍然主要适用于Windows平台。

  2. Direct2D/DirectWrite: 对于性能要求较高的应用,可以使用Direct2D或DirectWrite,这是更现代且高效的图形API,支持硬件加速。创建位图的代码会更加复杂,涉及到更多的底层细节。

示例代码 

#include <d2d1.h> // Direct2D头文件
#include <wincodec.h> // Windows Imaging Component (WIC)

HRESULT CreateRgbBitmap(ID2D1Factory* pFactory, int width, int height, ID2D1Bitmap** ppBitmap)
{
    IWICBitmap* pWicBitmap = nullptr;
    IWICImagingFactory* pWicFactory = nullptr;
    CoCreateInstance(CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, IID_IWICImagingFactory, (LPVOID*)&pWicFactory);

    HRESULT hr = pWicFactory->CreateBitmap(width, height, GUID_WICPixelFormat24bppBGR, WICBitmapCacheOnDemand, &pWicBitmap);
    
    if (SUCCEEDED(hr))
    {
        D2D1_BITMAP_PROPERTIES props = D2D1::BitmapProperties(D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED));
        hr = pFactory->CreateWicBitmapRenderTarget(pWicBitmap, &props, reinterpret_cast<ID2D1RenderTarget**>(ppBitmap));
    }

    SafeRelease(pWicBitmap);
    SafeRelease(pWicFactory);
    return hr;
}
  • 优点:更高的性能,尤其是在游戏和图形密集型应用中。提供了更多控制和灵活性。
  • 缺点:实现相对复杂,需要更多了解底层图形API,且代码不如C#中的简洁。

总结来说,C#创建位图更倾向于快速开发和易于维护,而C++提供了从高层级(使用托管代码)到低层级(使用原生API)的多种选择,后者更适合性能敏感或需要高度定制的场景。

 

C# 创建位图

在C#中,通常使用.NET Framework.NET Core/.NET 5+中的System.Drawing命名空间来创建位图。这是一个高层级的抽象,简化了图形处理的任务。

  • System.Drawing: 在C#中使用System.Drawing.Bitmap类时,通常处理的是RGB顺序。当你创建位图时,指定PixelFormat.Format24bppRgb意味着颜色通道按照红绿蓝的顺序排列。C#的Bitmap类默认预期数据是以RGB格式组织的,尽管实际内存布局可能因系统和图形硬件而异。

  • WPF或UWP: 在这些框架中,颜色通常也是以RGB形式处理,尽管具体的实现细节和API可能与System.Drawing有所不同。

示例代码 

using System.Drawing;
using System.Drawing.Imaging;

public Bitmap CreateRgbBitmap(int width, int height)
{
    // 使用指定宽度、高度和像素格式(24位RGB)创建位图
    Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
    return bitmap;
}
  • 优点:易于使用,提供了丰富的图像处理功能。
  • 缺点:依赖于.NET Framework,限制了跨平台能力(尽管.NET Core开始支持跨平台,但System.Drawing在非Windows平台上功能有限)。

 

读取dicom

在读取dicom后即可区分是灰度图像还是彩色图像。

C# 使用fo-dicom操作dicom文件-CSDN博客

 

总结

因此,当你从DICOM数据创建RGB位图并保存到内存时,确实需要根据你使用的编程语言、库以及最终目标(如显示设备的期望)来确定是否需要在RGB和BGR之间转换。在C++和C#中,确保你清楚地知道所使用的API或库的预期颜色格式,并相应地调整数据。

 

标签:C#,RGB,C++,System,BGR,API,Drawing
From: https://blog.csdn.net/wangnaisheng/article/details/140096081

相关文章

  • C#的方法重载,枚举,结构体
    一.方法重载staticvoidAdd(){Console.WriteLine(10+20);}staticvoidAdd(){Console.WriteLine(10.5+20.5);}上述的代码是无法运行的,报错的原因是因为,他们两个方法名一样,所以报错,而方法重载,简单的说就是要两个方法名一样,如果方法名一样,那又该怎么......
  • AT_tdpc_number 数 题解
    题目传送门前置知识数位DP|记忆化搜索解法本题的提交在luogu上挂了,建议去原站或Vjudge上提交。基础数位DP,记录当前位置、已填的数码之和,接着记忆化搜索即可。需要注意的是\(0\bmodd=0\),如果写得不太好看(未处理前导零)的话需要减去其贡献。代码#include<bits/......
  • python: create Envircomnet in vscode 创建虚拟机
    先配置python开发环境 1.在搜索栏输入“>"或是用快后键ctrl+shift+P键就会显示”>",再输入"python:"   选择已经安装好的python的版本至当前项目中   2terminal下输入相关命令行操作,选进入虚拟机的的文件夹下cd.venv/scripts再进行激活虚拟机。输入ac......
  • Hackthebox bagel.dll 代码审计
    利用ilspy将bagel.dll打开关于此目录有可以说的内容目录解析最上方的bagel是组装名字(assemblename)bagel_server是命令空间(namespace)下一级分支是类如File,Base,Handler,Orders等(class)反序列化导致的命令执行漏洞代码审计思路 首先看主程序Bagel1.通过明显的英语翻......
  • Elasticsearch集群部署(上)
    目录前言一.环境准备二.实施部署三. 安装配置head监控插件(只在第一台es部署)四.Kibana部署(当前还是在第一台es部署)五. 安装配置Nginx反向代理六. Logstash部署与测试前言1.Elasticsearch:  是一个基于Lucene的搜索服务器。提供搜集、分析、存储数据三大......
  • Neo4j-Cypher
    1.1Cypher1.1.1概念Neo4j中不存在表的概念,只有两类:节点(Node)和关联(Relation),可以简单理解为图里面的点和边。1.1.2CREATE新建节点-标签-关系CREATE(pll:TEST1{name:'森林',mj:"5000亩"}),(pl2:TEST1{name:'沙漠',mj:"3000亩"}),(lb1:TEST2{name:'大树'}......
  • CS253 Laboratory session
    CS253 Laboratorysession4Part 1: Disassembling code, going backwards, converting an executable back to Assembly Language.Preamble: Remember that whatever language you are using ultimately it runs as Machine Code onthe processor......
  • NetCore的全局日志记录
    Http进来的数据和出去的数据都记录在log中publicclassHttpLoggingMiddleware{privatereadonlyRequestDelegate_next;privatereadonlyILogger<HttpLoggingMiddleware>_logger;publicHttpLoggingMiddleware(RequestDelegatenext,ILogger<HttpLoggingM......
  • exLucas
    参考博客exLucas:求\(C_n^m\bmodd\)(\(d\)不一定为质数)1.将\(d\)质因数分解为\(d=p_1^{c_1}\timesp_2^{c_2}\times\cdots\timesp_k^{c_k}\)\(\foralli,j\in[1,k]\),\(p_i^{c_i}\)与\(p_j^{c_j}\)互质,所以可以构造出如下同余方程:\[\begin{cases}a_1\equivC_......
  • 电赛开发板之c2000 f28069m开发环境配置与报错because its compiler definition is no
    1.CSS报错Seedetailsbelow...  Error:Importfailedforproject'Example_2806xECap_Capture_Pwm'becauseitscompilerdefinitionisnotavailable.PleaseinstalltheC2000v22.6compilerbeforeimportingthisproject-click'View>CCSA......