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…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
游戏开发中常见的战斗数值英文缩写对照表
游戏开发中常见的战斗数值英文缩写对照表 基础属性(Basic Attributes) 缩写英文全称中文释义常见使用场景HPHit Points / Health Points生命值角色生存状态MPMana Points / Magic Points魔法值技能释放资源SPStamina Points体力值动作消耗资源APAction…...