.NET实现多图拼接(拼图)

拼图原理及流程:
拼图是将多个图片对象(Image/Bitmap继承自Image)重新绘制到一个图片对象,即最终的拼图对象

流程:

  1. 获取到图片对象,可通过本地或数据流获取
  2. 更具多个图片对象计算出最终生成的图片的宽高,以此初始化一个新的图片对象(拼图对象)
  3. 以像素点的方式,将要拼图的各个图片绘制到初始化的拼图对象
  4. 保存最终生成的图片,并释放图片对象(图片对象继承IDisable接口,使用using()或手动Dispose)

代码如下:

        /// <summary>
        /// 拼图
        /// 创建人:李子玉
        /// 日期:2017-08-18 09:57:12
        /// </summary>
        /// <param name="context"></param>
        private void Puzzle(HttpContext context)
        {

            // 最小图片宽度(此处取多张图片中宽度最小的,可根据具体情况自行决定)
            int w = list.Min(t => t.Width),
                // 上下留白高度(设置10px,可自行修改)
             c = 10,
                // 画布宽度
             width = w + 2 * c,
                // 画布高度
             height = 0,
                // 数组元素个数(即要拼图的图片个数)
             lenth = array.Length;

            // 图片集合
            Bitmap[] maps = new Bitmap[lenth];
            // 图片对应纵坐标集合
            int[] pointY = new int[lenth + 1];
            // 第一张图y轴起始未知
            pointY[0] = c;
            // 记录画布的总高度
            height = pointY[0];


----------
此处为根据条件获取服务器端数据流初始化Bitmap拼图方式:

            for (int i = 0; i < lenth; i++)
            {
                maps[i] = 请根据自己的方式得到照片数据;
                // 计算并保存照片拼接时Y轴起始位置
                pointY[i + 1] = maps[i].Height + height + c;
                // 记录画布总高度
                height = pointY[i + 1];
            }
            // 图片最终保存路径(此处保存到本地,可自行保存到其它位置或云)
            const string folder = @"C:\project";


----------
下面为读取本地图片初始化Bitmap拼接方式(可视具体情况自行编写):

            // Bitmap map = null;
            // 第一个图片对象
            //map = new Bitmap(Path.Combine(folder, "first.jpg"));
            //maps[0] = map;
            //pointY[1] = maps[0].Height + height + c;
            //height = pointY[1];
            // 第二个图片对象
            //map = new Bitmap(Path.Combine(folder, "second.jpg"));
            //maps[1] = map;
            //pointY[2] = maps[1].Height + height + c;
            //height = pointY[2];
            // 第三个图片对象
            //map = new Bitmap(Path.Combine(folder, "three.jpg"));
            //maps[2] = map;
            //pointY[3] = maps[2].Height + height + c;
            //height = pointY[3];

            // 初始化画布(最终的拼图画布)并设置宽高
            Bitmap bitMap = new Bitmap(width, height);
            // 初始化画板
            Graphics g1 = Graphics.FromImage(bitMap);
            // 将画布涂为白色(底部颜色可自行设置)
            g1.FillRectangle(Brushes.White, new Rectangle(0, 0, width, height));

            // 图片的Bitmap集合
            for (int m = 0; m < maps.Length; m++)
            {
                // 画布宽度
                for (int i = 0; i < maps[m].Width; i++)
                {
                    // 画布高度
                    for (int j = 0; j < maps[m].Height; j++)
                    {
                        // 以像素点形式绘制(将要拼图的图片上的每个坐标点绘制到拼图对象的指定位置,直至所有点都绘制完成)
                        var temp = maps[m].GetPixel(i, j);
                        // 将图片画布的点绘制到整体画布的指定位置
                        bitMap.SetPixel(c + i, pointY[m] + j, temp);
                    }
                }
                maps[m].Dispose();
            }
            // 保存输出到本地
            bitMap.Save(Path.Combine(folder, "new.jpg"));
            g1.Dispose();
            bitMap.Dispose();
        }

效果图如下(白色边框):这里写图片描述

原文链接http://blog.5lzy.com/Blog/Index/ViewEntity?code=WZ000019

猜你喜欢

转载自blog.csdn.net/o527883184/article/details/77387385