zoukankan      html  css  js  c++  java
  • 使用C#实现图片拼接

    本文记录一次 拼接图片的 需求,大致需求是这样,使用一款线阵相机拍摄图片,而每次拍摄尺寸是有限的,比如我这里需要拍摄一整个汽车的车底。所以再给相机设置好行平,图片尺寸等各种参数后,最终相机每拍摄一张,我就可以取到一张,同步进行图片的拼接处理,直到停止拍摄,最终生成一张图片。具体拼接的代码在本文最后。

    1、创建一个用于保存图片的队列

    private object lockQueue = new object(); //队列锁
    private Queue<Image> imageQueue = new Queue<Image>();
    

    2、将获取到的图片流转为Image类型然后入队

    var imagebuffer = xxxxxx;
    byte[] picBuffer = new byte[imageInfo.width];
    Marshal.Copy(imagebuffer, picBuffer, 0, picBuffer.Length);
    MemoryStream ms = new MemoryStream(picBuffer);
    var imageData = Image.FromStream(ms);
    lock (lockQueue)
    {
        //入队
         imageQueue.Enqueue(imageData);
        //通知等待队列中的线程锁定对象状态的更改(这个一般配合Monitor.Wait使用)
         Monitor.Pulse(lockQueue);
    }
    

    3、定义一个图片操作处理方法

    以下为业务代码,没啥太大的参考意义可直接掠过,其主要就是实现当有大于1张图片时从队列出取出图片开始拼接。多线程操作记得加锁。

    private void PictureHandler()
            {
                Task.Run(() =>
                  {
                      while (isStart)
                      {
                          if (imageQueue.IsEmpty())
                          {
                              lock (lockQueue)
                              {
                                  Monitor.Wait(lockQueue);
                              }
                              continue;
                          }
                          System.Drawing.Image image = null;
                          lock (lockQueue)
                          {
                              image = imageQueue.Dequeue();
                          }
                          if (SourceImage == null)
                          {
                              SourceImage = image;
                          }
                          else
                          {
                              lock (obj)
                              {
                                  //拼接图片
                                  SourceImage = JoinImage(SourceImage, image);
                              }
    
                          }
    
                      }
                  });
            }
    

    4、拼接图片实现方法

    需要注意的是是想让图片横向拼接还是竖向拼接,以下是竖向拼接,可以封装的更好一些,传入一个枚举来确定拼接方向,graph.DrawImage中的第二个参数和第三个参数X、Y坐标用来控制。

    image-20210816112527816

    /// <summary>
    /// 图片拼接
    /// </summary>
    /// <param name="sourceImg">图片1</param>
    /// <param name="newImg">图片2</param>
    /// <returns>拼接后的图片</returns>
    private static Image JoinImage(Image sourceImg, Image newImg)
    {
        int imgHeight = 0, imgWidth = 0;
    
        imgWidth = sourceImg.Width;
        imgHeight = sourceImg.Height + newImg.Height;
    
        Bitmap joinedBitmap = new Bitmap(imgWidth, imgHeight);
        using (Graphics graph = Graphics.FromImage(joinedBitmap))
                {
                    graph.DrawImage(sourceImg, 0, 0, sourceImg.Width, sourceImg.Height);
                    graph.DrawImage(newImg, 0, sourceImg.Height, newImg.Width, newImg.Height);
                }
                return joinedBitmap;
            }
    
  • 相关阅读:
    python中的继承和多态
    python中的深浅copy
    面向对象初识
    常用模块,异常处理
    递归,re,time,random
    内置函数,匿名函数
    生成器和迭代器
    记一次nginx由于文件过大的相关问题
    vue的Element+gin实现文件上传
    Vue问题汇总
  • 原文地址:https://www.cnblogs.com/chonglu/p/15146914.html
Copyright © 2011-2022 走看看