C#依据硬件传上来的数据 位图显示问题

![图片说明](https://img-ask.csdn.net/upload/201610/31/1477879610_274745.png)图片说明 private void RX_thread()
{
int buffersize = _SerialPort.BytesToRead; //十六进制数的大小
byte[] buffer = new Byte[buffersize]; //创建缓冲区

        _SerialPort.Read(buffer, 0, buffersize); //将数读到buffer里,来创建一个缓冲区;
        if (RX_HEX_checkBox.Checked)
        {
            RXbox.AppendText(HEX_To_String(buffer)); //将数据放在一个textbox 里,进行显示;
        }
        else
        {
            try
            {

                //int itemp = int.Parse(HEX_To_ASCII(buffer));
                //ltBuffer.Add();
                RXbox.AppendText(HEX_To_ASCII(buffer));
                //蛋疼的处理richtextbox
                //richtextbox中\n \r两者都是换行
                //if ((buffer[0] == 0x0A) && (flagRN)) { } else { flagRN = false; }

                //if (buffer[buffer.Length - 1] == 0x0D) { flagRN = true; }
            }
            catch { }

        }
        //if (scroll_checkBox.Checked)
        //{
        //    //RXbox.AutoScrollOffset
        //    //RXbox.view
        //    //RXbox_Scroll.Maximum = RXbox.ViewportHeight;
        //}
        RXL = RXL + buffer.Length;
        toolStripStatusLabel_R.Text = RXL.ToString();
        //MessageBox.Show(RXbox.Text);
        //if(ltBuffer.Count == 641)
        //{
        //    MessageBox.Show("1");

        //    if (ltBuffer[640] == "T")
        //    {
        //        ltBuffer.Clear();
        //    }
        //}
        //一下代码就是对位图进行一行行处理
       // if (ltBuffer.Count == 640)
        if (ltBuffer.Count > 640)
        {
            //draw
            Bitmap b = new Bitmap(16, 40);
            MemoryStream m = new MemoryStream(); //缓冲区?
            //锁定位图
            BitmapData bbb = b.LockBits(new System.Drawing.Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            IntPtr ptr = bbb.Scan0; //找到位图首地址
            byte[] byteData = new byte[b.Width * b.Height * 3];//存放位图
            System.Runtime.InteropServices.Marshal.Copy(ptr, byteData, 0, b.Width * b.Height * 3); //给RGB赋值  
            //核心代码,循环处理位图
            for (int i = 16 * 40 - 1; i >= 0; i--)
            {
                double dscal;

                if (double.Parse(ltBuffer[16 * 40 - 1 - i]) > 145)
                {
                    Console.WriteLine("I de 值:" + i+" "+ltBuffer);
                    dscal = 1;
                }
                else
                {
                    if (double.Parse(ltBuffer[16 * 40 - 1 - i]) < 16)
                    {
                        dscal = 0;
                    }
                    else
                    {
                        dscal = (double.Parse(ltBuffer[16 * 40 - 1 - i]) - 16) / 255.0;
                    }
                }

                if (dscal > 1)
                {
                    dscal = 1;
                }

                byteData[i * 3 + 0] = (byte)(255 * dscal);//B
                byteData[i * 3 + 1] = (byte)(255 * dscal);//G
                byteData[i * 3 + 2] = (byte)(255 * dscal);//R
            }
            //             if (ltBuffer.Count == 689)
            // 
            //             if (ltBuffer.Count > 688)      
            //                 {
            //                     //draw
            //                     Bitmap b = new Bitmap(16, 43);
            //                     MemoryStream m = new MemoryStream(); //缓冲区?
            //                     //锁定位图
            //                     BitmapData bbb = b.LockBits(new System.Drawing.Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            //                     IntPtr ptr = bbb.Scan0; //找到位图首地址
            //                     byte[] byteData = new byte[b.Width * b.Height * 3];//存放位图
            //                     System.Runtime.InteropServices.Marshal.Copy(ptr, byteData, 0, b.Width * b.Height*3); //给RGB赋值  
            //                     //核心代码,循环处理位图
            //                     for (int i = b.Width*b.Height - 1; i >= 0; i--)
            //                     {
            //                         double dscal;
            //                         if (double.Parse(ltBuffer[b.Width * b.Height - 1 - i]) > 156)//修改一处:
            //                         {
            //                             dscal = 1;
            //                         }
            //                         else
            //                         {
            //                             if (double.Parse(ltBuffer[b.Width * b.Height - 1 - i]) < 17)
            //                             {
            //                                 dscal = 0;
            //                             }
            //                             else
            //                             {
            //                                 dscal = (double.Parse(ltBuffer[b.Width * b.Height - 1 - i]) - 17) / 255.0;
            //                             }
            //                         }
            // 
            //                         if (dscal > 1)
            //                         {
            //                             dscal = 1;
            //                         }
            // 
            //                         byteData[i * 3 + 0] = (byte)(255-255 * dscal);//B
            //                         byteData[i * 3 + 1] = (byte)(255-255 * dscal);//G
            //                         byteData[i * 3 + 2] = (byte)(255-255 * dscal);//R
            //                     }
            //放回位图
            System.Runtime.InteropServices.Marshal.Copy(byteData, 0, ptr, b.Width * b.Height * 3);
            //释放位图    
            b.UnlockBits(bbb);

            //保存位图
            b.Save(m, ImageFormat.Bmp);
            //以下代码,进行位图的显示操作 
            Image bba = Image.FromStream(m);
            ImageAttributes im = new ImageAttributes();

            Graphics g = Graphics.FromImage(bba);
            this.pictureBox1.Image = bba;

            g.DrawImage(bba, new Point(20, 20));
            ltBuffer.Clear();
        }
        else  if(ltBuffer.Count > 640)//   // if(ltBuffer.Count > 688)
        {
            //  MessageBox.Show(ltBuffer.Count.ToString());
            ltBuffer.Clear();
        }
    }

2个回答

这个要看你的下位机的通讯协议,ltBuffer这个的格式是什么,按什么规则传输,先单独把这部分调试好了,再转换位图。

sinat_36564005
酬勤-人间道 我上传了那张图片,值显示了那么一小点,就是那个问题,能想到的我都试了一下.....
大约 4 年之前 回复

图片说明

sinat_36564005
酬勤-人间道 这个是C++的,是我要的显示的结果,C#就出现了问题
大约 4 年之前 回复
立即提问