使用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;
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM