博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用图片拼接图片 C#
阅读量:6836 次
发布时间:2019-06-26

本文共 3309 字,大约阅读时间需要 11 分钟。

  hot3.png

    

    在我把图片转化为了字符画,童鞋建议说是用小图片拼成一个大图片。我觉得这个想法不错,于是动手实现了一下。同样是C#写的,不得不说我自己在平时写的一些代码基本都是C#,python这种很高级的语言,怎么说呢,既然是“玩”,就不太想用C++,太累了  ┐(─_─)┌

下面是关键的代码(PS:还是通过计算像素的亮度,以后尝试用颜色什么的试试!!):

class ImageTools {        // 获取一副图片的平均属性        public static float getAverageProperty(Bitmap bitmap)         {            return getAveragePropertyInArea(bitmap, 0, 0, bitmap.Width, bitmap.Height);        }        ///         /// 获取指定区域的平均属性        ///         /// 图片        /// 起点的x坐标        /// 起点的y坐标        /// 宽度        /// 高度        /// 
public static float getAveragePropertyInArea(Bitmap bitmap, int startX, int startY, int width, int height) { float averProperty = 0; for (int w = 0; w < width; w++) { for (int h = 0; h < height; h++) { try { Color color = bitmap.GetPixel(startX + w, startY + h); averProperty += color.GetBrightness(); } catch (ArgumentOutOfRangeException) { averProperty += 0; } } } return averProperty / (width * height); } /// /// 创建拼接图片 /// /// 需要生产的原图的路径 /// 资源的图片文件夹路径 /// 生产的图片保存路径 /// /// 和xSize决定原图的多大一块需要被图片替换 /// 缩放比例 public static void createImage(String target, String srcRoot, String savePath, int xSize, int ySize, int scale) { Bitmap srcTargetImg = new Bitmap(target); Bitmap saveImg = new Bitmap(srcTargetImg.Width * scale, srcTargetImg.Height * scale); Graphics g = Graphics.FromImage(saveImg); g.Clear(System.Drawing.Color.White); String[] files = System.IO.Directory.GetFiles(srcRoot); Hashtable table = new Hashtable(); foreach (String file in files) { Bitmap bitmap = new Bitmap(file); if (bitmap != null) { table.Add(file, getAverageProperty(bitmap)); } } for (int w = 0; w < srcTargetImg.Width / xSize; w++) { for (int h = 0; h < srcTargetImg.Height / ySize; h++) { float averProperty = getAveragePropertyInArea(srcTargetImg, w * xSize, h * ySize, xSize, ySize); // 找到最接近的一张图 String fileToFind = ""; float lastDelta = 2; foreach (DictionaryEntry de in table) { if (Math.Abs(averProperty - (float)de.Value) < lastDelta) { lastDelta = Math.Abs(averProperty - (float)de.Value); fileToFind = (String)de.Key; } } Bitmap tmp = new Bitmap(fileToFind); // 绘制最终图片 g.DrawImage(tmp, w * xSize * scale, h * ySize * scale, xSize * scale, ySize * scale); } } g.Dispose(); saveImg.Save(savePath); } }

最终的效果

原图:

结果(最终图片大小为9600*9600,体积达到夸张的77M):

先来个全貌:

放大一点:

拉近:

转载于:https://my.oschina.net/sosofy/blog/110110

你可能感兴趣的文章
ORACLE SQL开发where子句之case-when
查看>>
姚期智:这是一个“前所未有”的金融科技与计算机科学的黄金时代
查看>>
Linux 批量依赖库拷贝(ldd)
查看>>
memcache和redis对比
查看>>
ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
查看>>
10.11杭州Clouder lab 十分钟搭建共享应用 2:如何通过日志服务实现用户的日志收集与分析...
查看>>
老旧的金融机构,是时候赶赶云计算的时髦了
查看>>
《Linux From Scratch》第三部分:构建LFS系统 第八章:让LFS系统可引导 - 8.2. 创建 /etc/fstab 文件...
查看>>
Python 进阶_OOP 面向对象编程_静态方法和类方法
查看>>
布线须知:机柜在数据中心机房的三个新用途
查看>>
迁移到云:渐进但不可逆转
查看>>
Patchwork间谍组织将目标扩大至政府
查看>>
工业物联网为“两化融合”带来巨大推力
查看>>
《UNIXLinux程序设计教程》一3.7 非阻塞I/O
查看>>
IBM遭标普下调评级
查看>>
手机短信验证码真的安全吗?
查看>>
关于智慧城市建设的几点建议
查看>>
Facebook高管:我们是科技公司 不是媒体公司
查看>>
《领域特定语言》一2.3DSL的问题
查看>>
TensorFlow 1.0 正式发布 你需要知道的都在这里
查看>>