C++与C#创建位图,是否需要区分RGB和BGR模式
在处理位图时,确实需要区分RGB和BGR模式,因为不同的库和API对颜色通道的排序有不同的约定。具体到C++与C#,这一点也是需要注意的。
C++ 创建位图
-  
使用GDI+或WIC (Windows Imaging Component): 当你在C++中使用这些Windows API创建或操作位图时,通常会指定像素格式,比如
PixelFormat24bppRGB或PixelFormat24bppBGR。这意味着你需要根据API的要求明确指定是RGB还是BGR。例如,GUID_WICPixelFormat24bppBGR明确指定了BGR顺序。 -  
OpenCV: 如果你使用OpenCV处理图像,其默认的颜色顺序是BGR,所以即使你处理的是RGB图像,也需要考虑颜色通道的转换。
 
C++中创建位图的方法更加多样化,取决于你是否使用托管代码(如C++/CLI)或原生代码。
使用C++/CLI(托管代码)
类似于C#,在C++/CLI中也可以使用.NET Framework的System.Drawing命名空间来创建位图,语法非常接近C#,如之前所示。
使用原生C++库(非托管代码)
-  
GDI+: 如之前示例,使用Windows的GDI+库创建位图。这种方法提供了跨平台之外的替代方案,但仍然主要适用于Windows平台。
 -  
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++与C#创建位图,是否需要区分RGB和BGR模式
在处理位图时,确实需要区分RGB和BGR模式,因为不同的库和API对颜色通道的排序有不同的约定。具体到C与C#,这一点也是需要注意的。 C 创建位图 使用GDI或WIC (Windows Imaging Component): 当你在C中使用这些Windows API创建或操作位图时&…...
web学习笔记(八十)
目录 1.小程序实现微信一键登录 2. 小程序的授权流程 3.小程序配置vant库 4.小程序配置分包 5.小程序配置独立分包 6.小程序分包预下载 1.小程序实现微信一键登录 要先实现小程序一键登录首先我们需要给按钮设置一个绑定事件,然后在绑定事件内部通过wx.login…...
深度解析 Raft 分布式一致性协议
本文参考转载至:浅谈 Raft 分布式一致性协议|图解 Raft - 白泽来了 - 博客园 (cnblogs.com) 深度解析 Raft 分布式一致性协议 - 掘金 (juejin.cn) raft-zh_cn/raft-zh_cn.md at master maemual/raft-zh_cn (github.com) 本篇文章将模拟一个KV数据读写服…...
Android10以上实现获取设备序列号功能
Android10以上实现获取设备唯一标识,目前只支持华为和荣耀设备。实现原理:通过无障碍服务读取序列号界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…...
从0到1:培训老师预约小程序开发笔记二
背景调研 培训老师预约小程序: 教师和学生可以更便捷地安排课程,并提升教学质量和学习效果,使之成为管理和提升教学效果的强大工具。培训老师可以在小程序上设置自己的可预约时间,学员可以根据老师的日程安排选择合适的时间进行预…...
【FFmpeg】av_read_frame函数
目录 1.av_read_frame1.2 从pkt buffer中读取帧(avpriv_packet_list_get)1.3 从流当中读取帧(read_frame_internal)1.3.1 读取帧(ff_read_packet)1.3.2 解析packet(parse_packet)1.3…...
女生学计算机好不好?感觉计算机分有点高……?
众所周知,在国内的高校里,计算机专业的女生是非常少的,很多小班30人左右,但是每个班女生人数只有个位数。这就给很多人一个感觉,是不是女生天生就不适合学这个东西呢?女生是不是也应该放弃呢?当…...
windows10/11 如何开启卓越性能模式
在Windows 10和Windows 11中,可以通过以下步骤启用“卓越性能”模式。请注意,卓越性能模式仅在Windows 10 Pro for Workstations和Windows 10 Enterprise版本中可用。 使用命令提示符启用卓越性能模式 打开命令提示符: 按Win X键࿰…...
JSP WEB开发(二) JavaBean
目录 JavaBean JavaBean特征 JavaBean的标签 JavaBean 的范围 标签 JavaBean JavaBean 是一种符合某些命名和设计规范的 Java 类,它是一种可重用组件技术,主要用于封装数据,执行负责的计算任务,封装事务逻辑等。JavaBean 的实…...
G2.【C语言】EasyX绘制颜色窗口
1.窗口 窗口:宽度*高度(单位都是像素) #include <stdio.h> #include <easyx.h> int main() {initgraph(640, 480);getchar();return 0; } 640是宽,480是高 2.操作窗口的三个按钮 #include <stdio.h> #incl…...
异构计算技术与DTK异构开发套件
异构计算技术与DTK异构开发套件 费林分类法:SISD SIMD MISD MIMD 指令流I和数据流D MIMD不同存储结构: UMA均匀存储访问模型NUMA非均匀存储访问模型Cluster集群 现在以Cluster为主 DTK异构开发套件 生态结构 异构并行编程模型是什么 HIPÿ…...
数据结构之“栈”(全方位认识)
🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 前言 栈是一种数据结构,具有" 后进先出 "的特点 或者也可见说是 ” 先进后出 “。大家一起加油吧冲冲冲!! …...
vue项目打包部署后 浏览器自动清除缓存问题(解决方法)
vue打包部署后 浏览器缓存问题,导致控制台报错ChunkLoadError: Loading chunk failed的解决方案 一、报错如下: 每次build打包部署到服务器上时,偶尔会出现前端资源文件不能及时更新到最新,浏览器存在缓存问题,这时在…...
解决vscode配置C++编译带有中文名称报错问题
在新电脑上安装vscode运行带有中文路径和中文名称的C代码时遇到报错 根据别人的教程将laugh.json文件中"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",改成了"program": "${fileDirname}\\output\\test.exe",&#x…...
A61 STM32_HAL库函数 之 TIM扩展驱动 -- C -- 所有函数的介绍及使用
A61 STM32_HAL库函数 之 TIM扩展驱动 -- C -- 所有函数的介绍及使用 1 该驱动函数预览1.24 HAL_TIMEx_OnePulseN_Stop1.25 HAL_TIMEx_OnePulseN_Start_IT1.26 HAL_TIMEx_OnePulseN_Stop_IT1.27 HAL_TIMEx_ConfigCommutationEvent1.28 HAL_TIMEx_ConfigCommutationEvent_IT1.29 …...
使用瀚高数据库开发管理工具进行数据的备份与恢复---国产瀚高数据库工作笔记008
使用瀚高数据库,备份 恢复数据 然后找到对应的目录 其实就是hgdbdeveloper,瀚高的数据库开发管理工具 对应的包中有个dbclient 这个目录,选中这个目录以后,就可以了,然后 在对应的数据库,比如 data_middle 中,选中 某个模式,比如bigdata_huiju 然后右键进行,点击 恢复,然…...
css 选择器汇总
目录 所有选择器伪类选择器 所有选择器 选择器用法id选择器#myid类选择器.myclassname标签选择器div,h1,p相邻选择器h1p子选择器ul > li后代选择器li a通配符选择器*属性选择器a[rel“external”]伪类选择器a:hover, li:nth-child 伪类选择器 在CSS3中新增了一个结构伪类选…...
My Greedy Algorithm(贪心算法)之路(一)
引子:我们之前,其实也遇到过贪心算法,0,1背包就是一个典型的贪心算法问题,那今天我就来开始my-Greedy Algorithm的道路。 什么是贪心算法? 我愿称贪心算法为贪婪鼠目寸光,贪心算法(Greedy Alg…...
Win11 Python3.10 安装pytorch3d
0,背景 Python3.10、cuda 11.7、pytorch 2.0.1 阅读【深度学习】【三维重建】windows10环境配置PyTorch3d详细教程-CSDN博客 1,解决方法 本来想尝试,结果发现CUB安装配置对照表里没有cuda 11.7对应的版本,不敢轻举妄动&#x…...
kotlin 中 string array 怎么表示
在 Kotlin 中,字符串数组可以使用 Array<String> 类型表示。你可以通过多种方式来创建和初始化字符串数组。以下是几种常见的方法: 使用 arrayOf 函数: val stringArray arrayOf("Hello", "World", "Kotli…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
