/// <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