使用C#实现图片拼接
2021/8/16 11:36:00
本文主要是介绍使用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坐标用来控制。
/// <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; }
这篇关于使用C#实现图片拼接的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#