拼图原理及流程:
拼图是将多个图片对象(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();
}
效果图如下(白色边框):
原文链接:http://blog.5lzy.com/Blog/Index/ViewEntity?code=WZ000019