zoukankan      html  css  js  c++  java
  • 自动生成圆形装盘奖励图片

    每次做抽奖活动的时候,会有一张圆形的奖励图片。这个图片有时候运营偶尔修改一下还可以接受,但是万一很频繁的更换里面的内容的话,那每次都做一次修改那就很浪费时间,然后就想到了用canvas来自动生成这张图片。这样就节省了很多时间。

    然后就需要用到一张固定尺寸的圆形转盘的背景,各种素材若干张,然后就可以自己手动上传图片生成这张图片了。

    这个主要就是用到了canvas的rotate,translate,drawImage的方法就可以完成了,注意这个仅提供一个demo,可以自己再优化的哦,至于怎么优化,用过才知道!

    HTML如下:

     1     <div class="page">
     2         <div class="title">
     3             <h1>自动生成圆形转盘图片1.0</h1>
     4         </div><!--end .title-->
     5         <div class="param">
     6             <div class="param-background">
     7                 <h3>背景图片</h3>
     8                 <div class="bg">
     9                     <span class="bg-item">背景图片:</span>
    10                     <span class="item-content">
    11                         <span class="fileWrapper">
    12                             <span class="input-file">
    13                                 选择文件<input type="file" hidefocus="true" value="" class="select-file">
    14                             </span>
    15                         </span>
    16                         <i class="filename"></i>
    17                     </span>
    18                     <div class="img-hold" id="bg"></div>
    19                 </div>
    20             </div><!--end .param-background-->
    21             <div class="param-base">
    22                 <h3>基本参数</h3>
    23                 <ul>
    24                     <li style="display: none;"><label>背景宽度:<input type="text" id="bgWidth" readonly= 'readonly'></label></li>
    25                     <li style="display: none;"><label>背景高度:<input type="text" id="bgHeight" readonly= 'readonly'></label></li>
    26                     <li style="display: none;"><label>奖品宽度:<input type="text" id="giftWidth" readonly= 'readonly'></label></li>
    27                     <li style="display: none;"><label>奖品高度:<input type="text" id="giftHeight" readonly= 'readonly'></label></li>
    28                     <li><label>图片拉伸:<input type="text" id="scaleWidth" value="1">宽度,系数少于1</label></li>
    29                     <li><label>图片拉伸:<input type="text" id="scaleHeight" value="1">高度,系数少于1</label></li>
    30                     <li><label>位移参数:<input type="text" id="displaceNum" value="50"></label>距离中心点的距离</li>
    31                     <li style="display: none;"><label>奖品个数:<input type="text" id="giftNum" readonly= 'readonly'></label></li>
    32                 </ul>
    33             </div><!--end .param-base-->
    34             <div class="param-img">
    35                 <h3>奖励图片</h3>
    36                 <ul id="gift-list">
    37                     <li>
    38                         <span class="item-title">图片1:</span>
    39                         <span class="item-content">
    40                             <span class="fileWrapper">
    41                                 <span class="input-file">
    42                                     选择文件<input type="file" hidefocus="true" value="" class="select-file">
    43                                 </span>
    44                             </span>
    45                             <i class="filename"></i>
    46                         </span>
    47                         <div class="img-hold"></div>
    48                         <div class="oprate">
    49                             <a href="javascript:;" class="add-btn">增加</a>
    50                             <a href="javascript:;" class="delete-btn">删除</a>
    51                         </div>                        
    52                     </li>                    
    53                 </ul>
    54             </div><!--end .param-img-->
    55         </div><!--end .param-->
    56         <div class="btn">
    57             <a href="javascript:void(0);">生成图片</a>
    58         </div>
    59         <div class="canvas-box">
    60             <h3>画布区域</h3>
    61             <canvas id="canvas"></canvas>
    62             <canvas id="temp"></canvas>
    63         </div><!--end .canvas-box-->
    64         <div class="result-box">
    65             <h3>图片区域</h3>
    66             <div class="result"></div>                
    67             <div class="result-btn">
    68                 <a href="#@" target="_blank">点击查看</a>
    69             </div>             
    70         </div><!--end .result-box-->    
    71     </div><!--end .page-->

    核心js代码:

      1 var A = {
      2     init: function() {
      3         A.chooseFile();
      4         $(document).delegate('.add-btn', 'click', A.addItem);
      5         $(document).delegate('.delete-btn', 'click', A.removeItem);
      6         $('.btn a').click(function() {
      7             A.convertImageToCanvas(); //先生成canvas
      8             var obj = document.getElementById('canvas');
      9             var image = A.convertCanvasToImage(obj); //后生成图片
     10             $('.result').html('').append(image); //插入图片
     11             $('.result-btn a').attr('href', image.src);
     12         });
     13     },
     14     chooseFile: function() {
     15         if (typeof FileReader === 'underfined') {
     16             alert('抱歉,你的浏览器不支持 FileReader');
     17             return false;
     18         } else {
     19             $(document).delegate('.select-file', 'change', A.readFile);
     20         }
     21     },
     22     getIndex: function(obj, arr) {
     23         var i = 0;
     24         for (i = 0; i < arr.length; i++) {
     25             if (arr[i] == obj) {
     26                 return i;
     27             }
     28         }
     29     },
     30     getParam: function() {
     31         $('#bgWidth').val(function() {
     32             return $('.bg').find('img').css('width') || 0;
     33         });
     34         $('#bgHeight').val(function() {
     35             return $('.bg').find('img').css('height') || 0;
     36         });
     37         $('#giftWidth').val(function() {
     38             return $('#gift-list').find('img').css('width') || 0;
     39         });
     40         $('#giftHeight').val(function() {
     41             return $('#gift-list').find('img').css('height') || 0;
     42         });
     43         $('#giftNum').val(function() {
     44             return $('#gift-list').find('img').size();
     45         })
     46     },
     47     readFile: function() { //读取图片显示图片
     48         var _this = this;
     49         var reader = new FileReader();
     50         var f = _this.files[0];
     51         if (!/image/w+/.test(f.type)) {
     52             alert("文件必须为图片!");
     53             return false;
     54         } else {
     55             reader.onload = function(e) {
     56                 var data = e.target.result;
     57                 var image = new Image();
     58                 image.onload = function() {
     59                     var width = image.width,
     60                         height = image.height;
     61                     $(_this).parents('.item-content').next('.img-hold').find('img').css({
     62                         'width': width,
     63                         'height': height
     64                     });
     65                     A.getParam();
     66                 };
     67                 image.src = data;
     68                 var imgHtml = '<img src="' + this.result + '" alt=""/>';
     69                 $(_this).parents('.item-content').next('.img-hold').html('').append(imgHtml);
     70             }
     71             reader.readAsDataURL(f);
     72             var fileName = _this.value.split('\').pop(); //获取文件选择框的值
     73             $(_this).parents('.item-content').find('.filename').text(fileName); //填充图片预览
     74         }
     75     },
     76     addItem: function() {
     77         var i = $('.item-title').size() + 1;
     78         var _html = '<li><span class="item-title">图片' + i + ':</span><span class="item-content"><span class="fileWrapper"><span class="input-file">选择文件<input type="file" hidefocus="true" value="" class="select-file"></span></span><i class="filename"></i></span><div class="img-hold"></div><div class="oprate"><a href="javascript:;" class="add-btn">增加</a><a href="javascript:;" class="delete-btn">删除</a></div></li>';
     79         $('#gift-list').append(_html);
     80     },
     81     removeItem: function() {
     82         var left = $('#gift-list li').size();
     83         if (left <= 1) {
     84             alert('只有一个了哦!')
     85         } else {
     86             $(this).parents('li').remove();
     87             $('#giftNum').val(left - 1);
     88             $('.item-title').each(function(i) {
     89                 $(this).text('图片' + (i + 1) + ':');
     90             });
     91         }
     92     },
     93     getJsImageObj: function() {
     94         var arr = [];
     95         var oImg = $('#gift-list').find('img');
     96         for (var i = 0; i < oImg.length; i++) {
     97             arr.push(oImg[i]);
     98         }
     99         return arr;
    100     },
    101     convertImageToCanvas: function() { //生成两个画布
    102         var context = document.getElementById('canvas');
    103         var ctx = context.getContext("2d");
    104         var ctxWidth = parseInt(document.getElementById('bgWidth').value);
    105         var ctxHeight = parseInt(document.getElementById('bgHeight').value);
    106         var image = $('.bg').find('img')[0]; //jq 转 js 对象
    107         context.setAttribute('width', ctxWidth); //绘制画布的宽度
    108         context.setAttribute('height', ctxHeight); //绘制画布的高度
    109         ctx.clearRect(0, 0, ctxWidth, ctxHeight); //画布某某个范围内的内容,参数分别为x,y,宽度,高度 
    110         ctx.drawImage(image, 0, 0); //绘制大背景
    111         A.printGift(); //打印图片
    112     },
    113     printGift: function() {
    114         var displaceNum = document.getElementById('displaceNum').value || 0;
    115         var scaleWidth = document.getElementById('scaleWidth').value || 0;
    116         var scaleHeight = document.getElementById('scaleHeight').value || 0;
    117         var context = document.getElementById('canvas');
    118         var ctx = context.getContext("2d");
    119         var deg = 360 / parseInt(document.getElementById('giftNum').value); //旋转角度
    120         var ctxWidth = parseInt(document.getElementById('bgWidth').value);
    121         var ctxHeight = parseInt(document.getElementById('bgHeight').value);
    122         var objGift = A.getJsImageObj();
    123         ctx.translate(ctxHeight / 2, ctxHeight / 2); //确定中心点中心点
    124         for (var i = 0; i < objGift.length; i++) { //循环绘制礼物小图
    125             ctx.save();
    126             ctx.rotate((deg * i) * Math.PI / 180);
    127             ctx.translate(0, -displaceNum);
    128             ctx.drawImage(objGift[i], -objGift[i].width / 2 * scaleWidth, -objGift[i].height / 2 * scaleHeight, objGift[i].width * scaleWidth, objGift[i].height * scaleHeight); //离中心点的参数也需要可以配置,参数:图片地址,离中心点X,离中心点y,图片width伸缩,图片height伸缩
    129             ctx.restore();
    130         }
    131     },
    132     convertCanvasToImage: function(canvas) { //canvas 转 image ,暂时只能转png
    133         var image = new Image();
    134         image.src = canvas.toDataURL("images/png");
    135         return image;
    136     }
    137 }
    138 A.init();

    样式就自己美化了哦,然后别忘添加JQ库噢!

  • 相关阅读:
    java不解压tar.gz读取包里面的某个文件内容或读取远程zip包中的文件内容
    java调用hadoop api
    httpclient读取https请求的数据
    使用svgo压缩图片
    重试机制
    java利用zip解压slpk文件
    mysql查询时特殊字符转译
    *.vue文件的template标签内使用form标签
    canvas.addEventListener()
    addEventListener(event, function, useCapture) 简记
  • 原文地址:https://www.cnblogs.com/violinxliu/p/3779021.html
Copyright © 2011-2022 走看看