C#传Bitmap到C++dll出现灰色图片的问题

news2024/11/19 13:33:31

如果直接将内存中的Bitmap 传给C++,原图会失去颜色,如下:

代码如下:

 ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
                System.Drawing.Imaging.Encoder myEncoder =
                System.Drawing.Imaging.Encoder.Quality;

                EncoderParameters myEncoderParameters = new EncoderParameters(1);
                Loger loger = new Loger();
                EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, xianWeiJingCanShu.picLevel);
                myEncoderParameters.Param[0] = myEncoderParameter;
                picID._bitmap.Save($@"D:\检测系统图像\{picID.id}\图像\{pointNo}_{picID.picture_name}.jpg",jpgEncoder,myEncoderParameters);//,ImageFormat.Jpeg {picID.id}_                                             //imageCount++; {pointNo}_{picID.imageCount.ToString("D2")}
                if (isShiBie)
                {
                    picID._bitmap.Dispose();
                    return;
                }
                //   loger.WriteImg(Encoding.UTF8.GetString(picID._bitmap.ToBytes(ImageFormat.Jpeg).ToArray()), picID.id+"yuan");
                //return;
                // Bitmap bmp = new Bitmap($@"D:\检测系统图像\{picID.id}\图像\{pointNo}_{picID.picture_name}.jpg");
                //  picID._bitmap = bmp;
                //    loger.WriteImg(Encoding.UTF8.GetString(picID._bitmap.ToBytes(ImageFormat.Jpeg).ToArray()), picID.id + "disk");
                Bitmap bmpInitial = new Bitmap(picID._bitmap);
                //将图像转换为24位rgb图像
                if (bmpInitial.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
                {
                    Console.WriteLine("转换8to24:{0}", path);
                    picID._bitmap = new Bitmap(bmpInitial.Width, bmpInitial.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    using (Graphics g = Graphics.FromImage(picID._bitmap))
                    {
                        g.DrawImage(bmpInitial, new Rectangle(0, 0, bmpInitial.Width, bmpInitial.Height));
                    }
                }
                else
                {
                    picID._bitmap = bmpInitial;
                }




              //  picID._bitmap = bmp;
                System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, picID._bitmap.Width, picID._bitmap.Height);
                System.Drawing.Imaging.BitmapData bmpData = picID._bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, picID._bitmap.PixelFormat);

                //System.Drawing.Imaging.PixelFormat pf = picID._bitmap.PixelFormat;
                //if (pf == System.Drawing.Imaging.PixelFormat.Format32bppArgb)
                //{
                //    stride = picID._bitmap.Width * 4;
                //}
                //else
                //{
                //    stride = picID._bitmap.Width * 3;
                //}

                int channel = 4;
                if (picID._bitmap.PixelFormat == PixelFormat.Format8bppIndexed)
                {
                    channel = 1;
                }
                else if (picID._bitmap.PixelFormat == PixelFormat.Format24bppRgb)
                {
                    channel = 3;
                }
                else if (picID._bitmap.PixelFormat == PixelFormat.Format32bppArgb)
                {
                    channel = 4;
                }

                stride = channel;

                loger.WriteLog(DateTime.Now.ToString("G"));
                loger.WriteLog($"开始识别------{picID.imageCount}--------"+picID.id);
                byte[] error = new byte[1024 * 10];
                var s = "";
                int result = -1;
                //  IntPtr ptrRet =(IntPtr) 0;
                IntPtr ptrIn = Marshal.StringToHGlobalAnsi($@"{pointNo}_{picID.picture_name}");//($@"{picID.id}_{pointNo}_{ picID.imageCount.ToString("D2")}"); {picID.id}_
                result = recogCell_mat_nopath(ptrIn, (IntPtr)bmpData.Scan0, picID._bitmap.Width, picID._bitmap.Height, stride, ref error[0]);
                
                loger.WriteLog($"识别结束--result:{result}----{picID.picture_name}--------" + picID.id);

 代码中保存硬盘的图片是彩色的,如果没有8转24位rgb这一段,C++收到的就可能是灰色的

 Bitmap bmpInitial = new Bitmap(picID._bitmap);
                //将图像转换为24位rgb图像
                if (bmpInitial.PixelFormat != System.Drawing.Imaging.PixelFormat.Format24bppRgb)
                {
                    Console.WriteLine("转换8to24:{0}", path);
                    picID._bitmap = new Bitmap(bmpInitial.Width, bmpInitial.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
                    using (Graphics g = Graphics.FromImage(picID._bitmap))
                    {
                        g.DrawImage(bmpInitial, new Rectangle(0, 0, bmpInitial.Width, bmpInitial.Height));
                    }
                }
                else
                {
                    picID._bitmap = bmpInitial;
                }

最后效果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699623.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

给若依添加单元测试(二)

给若依添加单元测试 方案一(简单) 方案二(异常困难但企业开发一般用这个) 在 activity 子模块中添加单元测试 S1.在 src 目录下创建 test.java.MapperTests 文件 S2.将以下内容复制进去 import com.ruoyi.activity.Activity…

C#私有构造函数学习

私有构造函数是一种特殊的实例构造函数。 它通常用在只包含静态成员的类中。 如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。 如果类T只声明了私有实例构造函数,则在T的程序文本外…

java项目之留学生交流互动论坛网站ssm源码

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的留学生交流互动论坛网站。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者&#xf…

python编码中常见问题及解决方案

文章目录 1. 输入minVal和maxVal,将 minVal - maxVal 分成 N 等份,列表返回2. request 请求MP4视频URL时,如何获取视频大小3. 输出00,01,02或001,002,003等格式字符串 1. 输入minVal和maxVal&am…

UE5 Stride Warping Orientation Warping功能学习

在UE5的 Lyra Demo中,运用到了各类动画Warping(动画扭曲)技术,通过各类Warping节点在动画蓝图中的合理组织,可以有效的解决运动滑步问题,并为动画增添更多细节。 本文主要基于Animation Warping插件讲一下…

vue echarts k线图 标记点根据条件设置颜色

1. 数据格式{属性1, 属性2, 属性3, 属性4{属性4.1, 属性4.2, 属性4.3}} {symbol: circle, symbolSize: 0,xAxis: 2023-01-01 08:36:00, yAxis: 0.06968924, label: {fontStyle: normal, fontSize: 13, color: blue} } 2. 自定义局部function 拼装数据 // data 是 自定义标记点…

element-ui el-tree功能应用

1.目录节点搜索功能&#xff1a; <el-tree>:filter-node-method"filterNode"</el-tree>//添加监听watch: {search(val) {this.$refs.tree.filter(val)}},// 树搜索filterNode(value, data) {if (!value) return truereturn data.name.indexOf(value) ! -…

安装MySQL实现远程访问链接---无需本地访问

文章目录 1. 安装Mysql2. 安装phpMyAdmin3. 修改User 表4. 本地测试连接5. 安装cpolar6. 配置公网访问地址7. 固定连接公网地址 转载自cpolar极点云文章&#xff1a;群晖NAS 安装 MySQL远程访问连接 群晖安装MySQL具有高效、安全、可靠、灵活等优势&#xff0c;可以为用户提供一…

mysql索引之B+树

1.概述 提到B树就不得不提及二叉树&#xff0c;平衡二叉树和B树这三种数据结构了。B树就是从他们三个演化来的。众所周知B树是一种常见的数据结构&#xff0c;被广泛应用于数据库和文件系统等领域&#xff0c;B树的设计目标是保持树的平衡性&#xff0c;以提供稳定的性能&…

磐石呼叫中心系统经常被UDP攻击的解方法

语音系统经常被UDP攻击&#xff0c;UDP攻击是一种常见的网络攻击形式&#xff0c;经常针对语音、视频和在线游戏等实时传输数据的应用程序。攻击者使用大量的UDP数据包向目标服务器发送请求&#xff0c;导致服务器过载&#xff0c;使其无法处理有效的请求&#xff0c;从而导致服…

01-基本数据类型和注释

基本数据类型 使用编程语言进行编程时&#xff0c;需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&#xff0c;当您创建一个变量时&#xff0c;就会在内存中保留使用一些空间。 您可能需要存储各种数据类型&#xff08;比如字符型、整型、浮…

C++数据结构笔记(3)线性表的链式存储底层实现

本系列的帖子并不包含全部的基础知识&#xff0c;只挑一部分最核心的知识点总结&#xff0c;着重于具体的实现细节而并非理论的知识点总结&#xff0c;大家按需阅读学习。 链表的核心概念总结如下&#xff1a; 1.链式存储不需要连续的内存空间 2.链表由一系列的结点组成&…

阿里云ECS U实例评测

参与ECSU实例评测&#xff0c;申请免费体验机会&#xff1a;https://developer.aliyun.com/mission/review/ecsu What u1实例是什么&#xff1f; u1实例本质上还是ecs服务器&#xff0c;但是是阿里云推出的一种新型实例规格族 阿里云根据使用场景和业务场景将ecs划分为不同的…

如何使用低代码推动企业数字转型

企业创建其所需数字解决方案的方式和速度正在发生历史性变化。企业可以通过各种方式来实现这一转型&#xff0c;低代码作为其中一种转型方式&#xff0c;也越来越受到企业的喜欢&#xff0c;帮助企业适应不断变化的条件。下面我们用天翎低代码平台为例&#xff0c;浅谈一下&…

人脸考勤签到升级篇

目录 编写签到成功页面&#xff08;移动端&#xff09; 实现考勤成功页面&#xff08;持久层&#xff09; 实现考勤成功页面&#xff08;业务层&#xff09; 实现考勤成功页面&#xff08;Web层&#xff09; 一、查询用户的入职日期 二、实现查询考勤结果的Web方法 实现…

8年资深测试总结,性能测试-性能内存详解,揭秘你的疑惑...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 缓存 从 free 命令…

python实现基于SVD矩阵分解的电影推荐系统设计

大家好&#xff0c;我是带我去滑雪&#xff01; SVD 是一种矩阵分解技术&#xff0c;通过将空间维数从 N 维降到 K 维&#xff08;其中K<N&#xff09;来减少数据集的特征数。在推荐系统中&#xff0c;SVD 被用作一种协同过滤技术。使用矩阵结构&#xff0c;其中行表示用户&…

CC2530 外部中断配置步骤

第一章 硬件原理图分析 第二章 配置按键中断步骤

Python:通过飞书API接口发送通知消息

通过飞书发送应用消息&#xff0c;及时收到线上异常消息 总的来说&#xff0c;飞书消息发送的前戏&#xff0c;要比企业微信和钉钉稍复杂 相关连接 官网 https://www.feishu.cn/管理后台 https://www.feishu.cn/admin开放平台 https://open.feishu.cn/ 参数准备 首先&…

JS中的函数与数组

文章目录 函数的定义与调用①、函数定义②、函数调用 函数的参数与返回值let与var关键字区别创建数组并使用数组遍历 函数的定义与调用 ①、函数定义 函数定义有三种方式&#xff1a; 第一种&#xff1a;function 函数名(){ 函数体 } 第二种&#xff1a;定义变量的语法&…