编程技术 · 2018 年 12 月 06 日 0

C#.net 2张图片合并输出 .NET实现多图拼接(拼图)

/// <summary>
    /// 调用此函数后使此两种图片合并,类似相册,有个
    /// 背景图,中间贴自己的目标图片
    /// </summary>
    /// <param name="sourceImg">粘贴的源图片</param>
    /// <param name="destImg">粘贴的目标图片</param>
    public static System.Drawing.Image CombinImage(string sourceImg, string destImg)
    {
        System.Drawing.Image imgBack = System.Drawing.Image.FromFile(sourceImg);     //相框图片 
        System.Drawing.Image img = System.Drawing.Image.FromFile(destImg);        //照片图片
 
 
 
        //从指定的System.Drawing.Image创建新的System.Drawing.Graphics       
        Graphics g = Graphics.FromImage(imgBack);
 
        g.DrawImage(imgBack, 0, 0, 148, 124);      // g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
        //g.FillRectangle(System.Drawing.Brushes.Black, 16, 16, (int)112 + 2, ((int)73 + 2));//相片四周刷一层黑色边框
 
 
 
        //g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
        g.DrawImage(img, 17, 17, 112, 73);
        GC.Collect();
 
        //输出文件流
        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        imgBack.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        System.Web.HttpContext.Current.Response.ClearContent();
        System.Web.HttpContext.Current.Response.ContentType = "image/png";
        System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
        imgBack.Dispose();
        return imgBack;
    }

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

流程:

获取到图片对象,可通过本地或数据流获取
更具多个图片对象计算出最终生成的图片的宽高,以此初始化一个新的图片对象(拼图对象)
以像素点的方式,将要拼图的各个图片绘制到初始化的拼图对象
保存最终生成的图片,并释放图片对象(图片对象继承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();
        }

原文链接

https://blog.csdn.net/o527883184/article/details/77387385

https://blog.csdn.net/prospertu/article/details/51337999

https://blog.csdn.net/Wind_Eagle/article/details/4781960

https://blog.csdn.net/csmzl/article/details/77677676