当前位置:   article > 正文

【小5聊】情人节送给爱人的心形创意相册_心形 相册

心形 相册

目录

【实现效果】

【开篇小叙】

【开发描述】

【简单设计】

【前端实现简述】

【后端实现简述】

【前端完整代码】

【后端完整代码】


【实现效果】

【开篇小叙】

新年之际,祝大家在新的一年里牛年大吉、家庭美满、万事顺利、生意兴隆、职位晋升、奖金多多。在情人节里,祝单身的小伙伴们必定找到心中所爱,祝已有佳人的小伙伴们更加幸福甜蜜。所以,小5也要在情人节送给爱人一份小小礼物,将和爱人的图片一键生成心形相册作为一件小惊喜,通过我们所学的技术也能创造点小浪漫,加油小伙伴们!

 

【开发描述】

  • 开发框架:.Net Framework 4.6.1
  • 后端语言:C#
  • 前端框架:css+div布局,jquery+jquery.form

 

【简单设计】

简单的在Excel文档里大概设计心形相册草稿,默认格式如下

1)宽为11个单元格子,高为10个单元格子,心形区域单元格为64个。

2)心形区域,每一个单元格为一张图片,至少两张图片,按图片顺序从左到右上到下叠加图片,不足64张图片,则会重复显示。

3)目的是可以将和爱人的合照等图片生成一张心形相册,作为一个创意相册保存起来也是不错的一件小惊喜!

【前端实现简述】

主要实现能够上传图片前进行预览,以及点击一键生成心形相册按钮时,能够调用后台接口生成心形相册图片

1、jquery引用,用于上传图片按钮的操作,此处可以单张图片选择或者多张图片选择预览显示

2、form引用,用于form表单提交图片,点击下载form表单js

【后端实现简述】

  • 获取图片

将前端传递过来的所有图片放到List泛型集合里,必须大于两张图片才能生成心形相册,当然,越多图片效果越好,最多64张图片。

尽量将图片设置统一大小或者高宽度差别不大的一批图片,这样生成会显示比较全,代码里也进行了逻辑处理,确保了520px正方形里能够填完图片,在不变形的情况下

  • 单元格和背景底图

设置单元格大小,高度=520px,宽度=520px,默认粉色背景,可设置透明背景,因此,整个底图的高度=10*520=5200,宽度=11*520=5720

  • 叠加图片

这里的叠加逻辑是,先从左上角开始,先行后列进行定位,根据excel设计好的图案给对应坐标的单元格叠加上图片即可

第1行的第4列、第8列为一个图片单元格
第2行的第3、5、7、9列为一个图片单元格
第3行的第2、6、10列为一个图片单元格
第4、5行的第1、11列为一个图片单元格
第6行的第2、10列为一个图片单元格
第7行的第3、9列为一个图片单元格
第8行的第4、8列为一个图片单元格
第9行的第5、7列为一个图片单元格
第10行的第6列为一个图片单元格

  • 温馨提示

解决上传太多图片文件太大的问题

由于C#对于传统的input-file默认能接收4M大小的文件图片,所以在上传60多张 图片时,肯定超过了4M,需要通过web.config配置修改限制

方式一 :设置请求大小,maxRequestLength,以及线程数

  1. <system.web>
  2. <httpRuntime targetFramework="4.5.2" executionTimeout="90" maxRequestLength="2097151" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100"/>
  3. <compilation debug="true" targetFramework="4.6.1" />
  4. </system.web>

方式二:设置最大允许内容大小,maxAllowedContentLength

  1. <system.webServer>
  2. <security>
  3. <requestFiltering>
  4. <requestLimits maxAllowedContentLength="2072576000"/>
  5. </requestFiltering>
  6. </security>
  7. </system.webServer>

【前端完整代码】

  1. <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
  2. <style type="text/css">
  3. html, body {
  4. margin: 0;
  5. padding: 0;
  6. background: #f9f9f9;
  7. font-size: 13px;
  8. }
  9. .clear {
  10. *zoom: 1;
  11. }
  12. .clear:after {
  13. content: '';
  14. display: table;
  15. clear: both;
  16. }
  17. </style>
  18. <div>
  19. <form id="imageForm" style="display:block;">
  20. <div class="clear" style="margin:10px 0px;width:auto;height:35px;line-height:35px;">
  21. <div class="btnGet" style="float:left;width:100%;height:100%;background:#0aadff;color:#fff;text-align:center;cursor:pointer;">
  22. <span style="font-size:1.3rem;">一键生成心形相册</span>
  23. </div>
  24. </div>
  25. <div class="fileList" style="margin-top:10px;">
  26. </div>
  27. <div class="" style="margin-top:10px;width:100%;text-align:center;color:#555;">
  28. <div class="preImage clear"></div>
  29. <div id="btn" style="margin:0 auto;margin-top:10px;width:80%;height:50px;line-height:50px;color:#888;text-align:center;position:relative;">
  30. <div style="border:1px dashed #ccc;">
  31. <span style="font-size:30px;">+</span>
  32. <input class="image-file" name="file" type="file" multiple="multiple" style="opacity:0;width:100%;height:100%;position:absolute;top:0px;left:0px;" />
  33. </div>
  34. </div>
  35. </div>
  36. <div class="gifImage" style="display:none;width:100%;text-align:center;color:#555;position: fixed;background: rgba(0,0,0,0.6);top: 0;height: 100%;"></div>
  37. </form>
  38. </div>
  39. <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
  40. <script src="文章有提供下载/jQuery/jquery.form.js"></script>
  41. <script type="text/javascript">
  42. (function () {
  43. var param = {
  44. getImageColorUrl: 'http://localhost:5852/Image/LoveImage',
  45. x: 0,
  46. y: 0,
  47. width: 0,
  48. height: 0,
  49. imgLength: 0,
  50. flag:0,
  51. getImageColor: function () {
  52. if (param.flag) return;
  53. param.flag = 1;
  54. if ($(".image-file").val() == '') {
  55. alert('请上传图片!');
  56. return;
  57. }
  58. var data = { x: param.x, y: param.y, width: param.width, height: param.height };
  59. $(".btnGet span").html("图片图生成中...");
  60. $("#imageForm").ajaxSubmit({
  61. url: param.getImageColorUrl,
  62. data: data,
  63. dataType: "json",
  64. type: 'post',
  65. success: function (d) {
  66. param.flag = 0;
  67. $(".btnGet span").html("一键生成心形图册");
  68. if (d.c == 200) {
  69. $(".gifImage").show().html('<img src="http://localhost:5852' + d.d.replace('//','/') + '" style="width:80%;margin:0 auto;margin: 50px;" /><div id="closeDiv" style="margin:0 auto;margin-top:10px;width:30%;padding:5 15px;background:#fff;border-radius:5px;">关闭</div>');
  70. $("#closeDiv").click(function () {
  71. $(".gifImage").hide();
  72. $(".gifImage").html("");
  73. });
  74. }
  75. else {
  76. alert(d.m);
  77. }
  78. },
  79. error: function () {
  80. $(".btnGet span").html("一键生成心形图册");
  81. param.flag = 0;
  82. }
  83. });
  84. },
  85. imageColor: function () {
  86. $(".btnGet").click(function () {
  87. if (param.imgLength < 2) {
  88. alert('请上传两张以及以上的图片!');
  89. return;
  90. }
  91. param.width = 0;
  92. param.getImageColor();
  93. });
  94. },
  95. imageScan: function () { //图片预览
  96. param.previewImageMore({
  97. idClass: ".image-file",
  98. success: function (base64) {
  99. param.imgLength = $(".image-file").length;
  100. var html = '';
  101. html += '<div style="float:left;width:25%;text-align:center;"><img class="item" src="' + base64 + '" style="width:90%;" /></div>'
  102. $(".preImage").append(html);
  103. $(".image-file").eq(length - 1).css("top", "-1000px");
  104. $("#btn").append('<input class="image-file" name="file" type="file" multiple="multiple" style="opacity:0;width:100%;position:absolute;top:0px;left:0px;" />');
  105. }
  106. });
  107. },
  108. previewImageMore: function (param) {
  109. $("body").off("change", param.idClass);
  110. $("body").on("change", param.idClass, function () {
  111. var that = this;
  112. if (typeof FileReader == 'undefined') alert("浏览器不支持FileReader接口");
  113. var file = that.files; //选择图片,马上预览
  114. for (var i = 0; i < file.length; i++) {
  115. var _file = file[i];
  116. var reader = new FileReader();
  117. reader.readAsDataURL(_file);
  118. reader.onload = function (e) {
  119. param.success(e.target.result); //base64
  120. }
  121. }
  122. });
  123. }
  124. };
  125. $(function () {
  126. param.imageColor();
  127. param.imageScan();
  128. });
  129. })();
  130. </script>

【后端完整代码】

  1. #region 心形图册
  2. [HttpPost]
  3. public JsonResult LoveImage(int maxSize = 520)
  4. {
  5. try
  6. {
  7. maxSize = 400;
  8. #region 获取前端图片
  9. HttpRequestBase Request = new HttpRequestWrapper(System.Web.HttpContext.Current.Request);
  10. //获取web端form表单提交过来的图片
  11. HttpFileCollectionBase file = Request.Files; //Request.Files和Request.Files["file"],加个中括号表示具体的一个了
  12. if (file == null)
  13. {
  14. return Json(r);
  15. }
  16. //有效图片判断
  17. List<Image> imageList = new List<Image>();
  18. int num = 0;
  19. foreach (string key in file.AllKeys)
  20. {
  21. HttpPostedFileBase item = file[num];
  22. num++;
  23. //保证图片最小高宽度为520px
  24. //取中间图片
  25. int newWidth = 0;
  26. int newHeight = 0;
  27. Image image = Image.FromStream(item.InputStream);
  28. if (image.Width > image.Height)
  29. {
  30. newHeight = maxSize;
  31. newWidth = (image.Width * newHeight) / image.Height;
  32. }
  33. else
  34. {
  35. newWidth = maxSize;
  36. newHeight = (image.Height * newWidth) / image.Width;
  37. }
  38. image = GetNewImageByWidthOrHeight(image, newWidth, newHeight);
  39. imageList.Add(image);
  40. }
  41. int count = imageList.Count;
  42. int currentIndex = 0;
  43. #endregion
  44. #region 创建底图 - 粉色背景
  45. int widthCount = 11;
  46. int heightCount = 10;
  47. int widthBg = widthCount * maxSize;
  48. int heightBg = heightCount * maxSize;
  49. Image backgroundImage = new Bitmap(widthBg, heightBg);
  50. using (Graphics graphics = Graphics.FromImage(backgroundImage)) //定义一个绘图对象
  51. {
  52. //Color color_a = ColorTranslator.FromHtml("#f7acbc");
  53. Color color_a = Color.FromArgb(255, ColorTranslator.FromHtml("#f7acbc")); //设置一定值的透明度,0~255,0=透明
  54. graphics.FillRectangle(new SolidBrush(color_a), new Rectangle(0, 0, widthBg, heightBg)); //给图片填充颜色
  55. }
  56. #endregion
  57. //叠加图片 - 根据坐标
  58. for(int y = 0; y < 10; y++)
  59. {
  60. for (int x = 0; x < 11; x++)
  61. {
  62. #region 按顺序叠加,循环叠加
  63. if ((y == 0 && x == 3) || (y == 0 && x == 7) ||
  64. (y == 1 && (x >= 2 && x <= 4)) || (y == 1 && (x >= 6 && x <= 8)) ||
  65. (y == 2 && (x >= 1 && x <= 9)) ||
  66. (y == 3 && (x >= 0 && x <= 10)) ||
  67. (y == 4 && (x >= 0 && x <= 10)) ||
  68. (y == 5 && (x >= 1 && x <= 9)) ||
  69. (y == 6 && (x >= 2 && x <= 8)) ||
  70. (y == 7 && (x >= 3 && x <= 7)) ||
  71. (y == 8 && (x >= 4 && x <= 6)) ||
  72. (y == 9 && (x >= 5 && x <= 5))
  73. )
  74. {
  75. Image image = imageList[currentIndex];
  76. image = ImageHelper.CutImage(image, 0, 0, maxSize, maxSize);
  77. using (Graphics graphics = Graphics.FromImage(backgroundImage))
  78. {
  79. int imageInBackgroundImage_x = x * maxSize;
  80. int imageInBackgroundImage_y = y * maxSize;//第一行
  81. Rectangle _r = new Rectangle(imageInBackgroundImage_x, imageInBackgroundImage_y, image.Width, image.Height); //叠图相对于底图的坐标
  82. int imageSelf_x = 0; //相对叠图自己的坐标系x轴,假设宽度为50,那么设置x=50,那么相对于自己的体系,就超出了自己的宽度,就看不见了
  83. int imageSelf_y = 0; //相对叠图自己的坐标系y轴
  84. graphics.DrawImage(image, _r, imageSelf_x, imageSelf_y, image.Width, image.Height, GraphicsUnit.Pixel);
  85. }
  86. if (currentIndex >= (count - 1)) currentIndex = 0;
  87. else currentIndex += 1;
  88. }
  89. #endregion
  90. }
  91. }
  92. //保存图片
  93. GetPathModel pathModel = CommonHelper.GetPathEx("LoveImage");
  94. backgroundImage.Save(pathModel.all);
  95. r.c = 200;
  96. r.d = pathModel.part;
  97. }
  98. catch (Exception ex)
  99. {
  100. LogHelper.Error(ex);
  101. }
  102. return Json(r);
  103. }
  104. #endregion
  105. #region 图片的放大与缩小
  106. public static Bitmap GetNewImageByWidthOrHeight(Image image, int width = 0, int height = 0)
  107. {
  108. ImageInfoModel_Response _ImageInfoModel_Response = new ImageInfoModel_Response();
  109. Bitmap bitmap = null;
  110. try
  111. {
  112. int newHeight = 0;
  113. int newWidth = 0;
  114. if (width > 0)
  115. {
  116. newWidth = width;
  117. newHeight = newWidth * image.Height / image.Width;
  118. }
  119. else
  120. {
  121. newHeight = height;
  122. newWidth = newHeight * image.Width / image.Height;
  123. }
  124. bitmap = new Bitmap(newWidth, newHeight); //创建一定高宽度的矩形图片,默认是黑色背景
  125. using (Graphics graphics = Graphics.FromImage(bitmap)) //从指定的图片里进行绘制内容
  126. {
  127. //在指定位置并且按指定大小绘制指定的图片
  128. graphics.DrawImage(image, 0, 0, newWidth, newHeight);
  129. //保存当前状态
  130. graphics.Save();
  131. }
  132. }
  133. catch (Exception ex)
  134. {
  135. LogHelper.Error(ex);
  136. }
  137. return bitmap;
  138. }
  139. #endregion

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/92748
推荐阅读
相关标签
  

闽ICP备14008679号