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

文章讨论了在从内存中直接传递Bitmap到C++时,原图可能会失去颜色的问题。通过检查并转换Bitmap的像素格式为24bppRgb,确保了图像色彩的正确传输。代码示例中展示了如何进行转换以及识别过程。
摘要由CSDN通过智能技术生成

如果直接将内存中的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;
                }

最后效果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

boat99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值