您的位置:首页 > Web前端 > JavaScript

原生Js基于HTML5 FileReader&canvas制作的banner广告图片插件

2013-06-14 16:54 966 查看
有了HTML5的FileReader&canvas这两个方法 不需要走后台服务就可以编辑生成图片了,插件只能在支持HTML5的浏览器上使用!!

简单制作过程和思路
1.创建画布
2.上传图片预览到画布
3.创建input参数控制样式
4.输出图片

=============================================

用到了两个知识点
1.html5 FileReader可以本地读取FILE文件
2.html5 Canvas用来绘图toDataURL生成图片

=============================================

参考学习资料
FileReader详解与实例---读取并显示图像文件 http://www.jsmix.com/blog/html5/file-reader.html
HTML5 Canvas 初步:字符串,路径,背景,图片 http://blog.csdn.net/sadfishsc/article/details/6873637
在线效果预览:http://jsfiddle.net/dtdxrk/m42VP/embedded/result/



<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>原生Js基于HTML5 canvas制作的banner广告图片插件</title>
</head>
<style type="text/css">
*{margin: 0;padding: 0;font:13px Arial;list-style: none;}
#warp{border: 1px solid #ccc;border-radius: 5px;width: 380px;background-color: #ececec;margin: 10px;line-height: 1.5;}
#warp li{margin: 10px;}
#warp li.line{background-color: #ccc;height: 1px;padding: 0;line-height: 1;font-size: 0;}
#warp li span{text-align: right;width: 120px;display: inline-block;}
#warp li #bt{padding: 5px 20px;margin:5px 0 5px 130px;}
#warp li a{display:inline-block;cursor: pointer;border: 1px solid #fff;text-indent: -9999px;width: 15px;height: 15px;}
#warp li a.active{border: 3px solid #000;}
#warp input[type=text]{border-radius: 3px; border: 1px solid #ccc; height: 23px;padding-left: 3px;margin: 0 5px;}
#warp input.short{width:40px;}
#warp input.w80{width:80px;}
#mark{position: absolute;top: 10px;left:420px;}
#worng{border-bottom: 1px solid red; display: none; background-color: #ffb2b2; text-align: center;font-size: 14px; font-weight: bold; padding: 5px 0;}
#showImg{display:none;position: absolute;top: 400px;left:420px;}
#showImg h1{color: red;font-weight: bold;font-family: "微软雅黑";font-size: 16px;}

.white{background-color: white;}
.gray{background-color: gray;}
.yellow{background-color: yellow;}
.green{background-color: green;}
.blue{background-color: blue;}
.red{background-color: red;}
.coffee{background-color: #632f00;}
.orange{background-color: orange;}
.purple{background-color: purple;}
</style>
<body>
<div id="worng">很抱歉,你的浏览器不支持FileReader方法!请安装Firefox或者Chrome浏览器</div>

<div id="warp">
<ul>
<li><span>图片上传:</span><input type="file" name="file" id="file" /></li>
<li class="line"></li>
<li><span>广告宽度:</span><input type="text" id="adWidth"  class="short" value="580" />px</li>
<li><span>广告高度:</span><input type="text" id="adHeight"  class="short" value="180" />px</li>
<li class="line"></li>
<li><span>文字背景颜色:</span>
<a class="gray active" rgb="37,37,37">黑色</a>
<a class="white" rgb="255,255,255">白色</a>
<a class="yellow" rgb="244,179,0">黄色</a>
<a class="green" rgb="120,186,0">绿色</a>
<a class="blue" rgb="37,115,236">蓝色</a>
<a class="red" rgb="174,17,61">红色</a>
<a class="coffee" rgb="46,23,0">咖啡</a>
<a class="orange" rgb="176,30,0">橙色</a>
<a class="purple" rgb="114,0,172">紫色</a>
</li>
<li><span>文字背景透明度:</span><input type="text" id="bgOpacity"  class="short" value="0.5" /></li>
<li><span>文字背景距离Top:</span><input type="text" id="bgTop"  class="short" value="110" />px</li>
<li><span>文字背景高度:</span><input type="text" id="bgHeight"  class="short" value="70" />px</li>
<li class="line"></li>
<li><span>标题文字:</span><input type="text" id="titleCon"  value="标题文字" /></li>
<li><span>标题字号:</span><input type="text" id="titleSize"  class="short" value="25" />px</li>
<li><span>标题颜色:</span><input type="text" id="titleColor"  class="short w80" value="#fff" /></li>
<li><span>标题距离Top:</span><input type="text" id="titleTop"  class="short" value="140" />px</li>
<li><span>标题距离Left:</span><input type="text" id="titleLeft"  class="short" value="10" />px</li>
<li class="line"></li>
<li><span>描述文字:</span><input type="text" id="txtCon"   value="描述文字描述描述描述描述" /></li>
<li><span>描述字号:</span><input type="text" id="txtSize"  class="short" value="15" />px</li>
<li><span>描述颜色:</span><input type="text" id="txtColor"  class="short w80" value="#fff" /></li>
<li><span>描述距离Top:</span><input type="text" id="txtTop"  class="short" value="170" />px</li>
<li><span>描述距离Left:</span><input type="text" id="txtLeft"  class="short" value="10" />px</li>
<li><button id="bt">生成图片</button></li>
</ul>
</div>
<canvas id="mark"></canvas>
<div id="showImg">
<h1>这里是生成的图片 可以点击右键另存</h1>
<img src="" id="asImg" />
</div>

<script type="text/javascript">

var _CalF = {
$ : function(object){//选择器
if(object === undefined ) return;
var getArr = function(name,tagName,attr){
var tagName = tagName || '*',
eles = document.getElementsByTagName(tagName),
clas = (typeof document.body.style.maxHeight === "undefined") ? "className" : "class";//ie6
attr = attr || clas,
Arr = [];
for(var i=0;i<eles.length;i++){
if(eles[i].getAttribute(attr)==name){
Arr.push(eles[i]);
}
}
return Arr;
};

if(object.indexOf('#') === 0){  //#id
return document.getElementById(object.substring(1));
}else if(object.indexOf('.') === 0){  //.class
return getArr(object.substring(1));
}else if(object.match(/=/g)){  //attr=name
return getArr(object.substring(object.search(/=/g)+1),null,object.substring(0,object.search(/=/g)));
}else if(object.match(/./g)){ //tagName.className
return getArr(object.split('.')[1],object.split('.')[0]);
}
},
addHandler:function(node, type, handler){
node.addEventListener ? node.addEventListener(type, handler, false) : node.attachEvent('on'+ type, handler);
},
removeHandler: function (node, type, handler) {
node.removeEventListener ? node.removeEventListener(type, handler, false) : node.detachEvent("on" + type, handler);
},
getPosition : function(obj) { //获取元素在页面里的位置和宽高
var top = 0,
left = 0,
width = obj.offsetWidth,
height = obj.offsetHeight;

while(obj.offsetParent){
top += obj.offsetTop;
left += obj.offsetLeft;
obj = obj.offsetParent;
}

return {"top":top,"left":left,"width":width,"height":height};
},
addClass:function(c,node){  // 添加样式名
node.className = node.className + ' ' + c;
},
removeClass:function(c,node){ // 移除样式名
var reg = new RegExp("(^|\\s+)" + c + "(\\s+|$)","g");
node.className = node.className.replace(reg, '');
},
stopPropagation:function(event){  // 阻止冒泡
var event = event || window.event;
event.stopPropagation ? event.stopPropagation() : event.cancelBubble = true;
},
ie6 : function(){
return !!window.ActiveXObject && !window.XMLHttpRequest;
}

};

(function(){
var adWidth,adHeight,
bgRGB,bgColor="0,0,0",bgOpacity,bgTop,bgHeight,
titleCon,titleSize,titleColor,titleTop,titleLeft,
txtCon,txtSize,txtColor,txtTop,txtLeft;

var regex = {
reg0:/^([1-9]\d*)$/,      // 验证正整数
reg1:/^-?(0|[1-9]\d*)$/, // 验证零正负整数
reg2:/^(0|0\.\d*|1)$/,   // 验证透明度0-1
reg3:/^([1-9]|10|0\.\d*)$/,      // 缩放比例0-10,不包含0
reg4:/^#([0-9a-zA-Z]{3}|[0-9a-zA-Z]{6})$/   // 验证颜色值
}

var tips = [
'宽高只能为大于0的整数',
'偏移量只能为零和正负整数',
'透明度值在0-1之间,包括0和1',
'字号只能为正整数',
'颜色值格式不正确,为#fff或#ffffff格式'
];

var warp = _CalF.$("#warp"),
canvas = _CalF.$("#mark"),
image = new Image(),
inputs = warp.getElementsByTagName("input"),
inputsLen = inputs.length,
a = warp.getElementsByTagName("a"),
aLen = a.length,
onloadIMG = false;

//input事件
for(var i=0;i<inputsLen;i++){
if(inputs[i].type != 'button' && inputs[i].type != 'file'){
inputs[i].onchange = getValue;
}
}

//文字背景颜色
for(var h =0; h<aLen;h++){
a[h].onclick = function(){
for(var j=0;j<aLen;j++){
_CalF.removeClass("active",a[j]);
}
bgColor = this.getAttribute("rgb");
_CalF.addClass("active",this);
getValue();
}
}

_CalF.$("#bt").onclick = createIMG;

if(typeof FileReader === 'undefined' ){ //兼容判断
_CalF.$("#worng").style.display = "block";
}else{
_CalF.addHandler(_CalF.$("#file"),"change",readFile);
}

//选择图片
function readFile(){
var file = this.files[0],
reader = new FileReader(),
fileFilter = /^(?:image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x\-cmu\-raster|image\/x\-cmx|image\/x\-icon|image\/x\-portable\-anymap|image\/x\-portable\-bitmap|image\/x\-portable\-graymap|image\/x\-portable\-pixmap|image\/x\-rgb|image\/x\-xbitmap|image\/x\-xpixmap|image\/x\-xwindowdump)$/i;
if(!fileFilter.test(file.type)){
alert("请选择图像文件!");
return false;
}
reader.readAsDataURL(file);
reader.onload = function(event){
image.src = event.target.result;
onloadIMG = true;
image.onload = getValue;
};
}

//创建画布
function createCanvas(){
var dome = canvas.getContext('2d');
canvas.width = adWidth;
canvas.height = adHeight;

//绘制画布
dome.fillStyle='#ffffff';
dome.drawImage(image,0,0);

// 绘制描述背景
dome.fillStyle = bgRGB;
dome.fillRect(0, bgTop, adWidth, bgHeight);

// 绘制标题文字
dome.fillStyle = titleColor;
dome.font = "bold "+ titleSize + "px 微软雅黑";
dome.fillText(titleCon, titleLeft, titleTop);

// 绘制描述文字
dome.fillStyle = txtColor;
dome.font = "normal " + txtSize + "px 微软雅黑";
dome.fillText(txtCon, txtLeft, txtTop);
}

//获取input值
function getValue(){
adWidth = _CalF.$("#adWidth").value;
adHeight = _CalF.$("#adHeight").value;

bgOpacity = _CalF.$("#bgOpacity").value;
bgTop = _CalF.$("#bgTop").value;
bgHeight = _CalF.$("#bgHeight").value;
bgRGB = "rgba("+ bgColor +","+bgOpacity+")";

titleCon = _CalF.$("#titleCon").value;
titleSize = _CalF.$("#titleSize").value;
titleColor = _CalF.$("#titleColor").value;
titleTop = _CalF.$("#titleTop").value;
titleLeft = _CalF.$("#titleLeft").value;

txtCon = _CalF.$("#txtCon").value;
txtSize = _CalF.$("#txtSize").value;
txtColor = _CalF.$("#txtColor").value;
txtTop = _CalF.$("#txtTop").value;
txtLeft = _CalF.$("#txtLeft").value;

if(!checkFormat("adWidth",regex.reg0,tips[0],580)) return false;
if(!checkFormat("adHeight",regex.reg0,tips[0],180)) return false;

if(!checkFormat("bgOpacity",regex.reg2,tips[2],0.5)) return false;
if(!checkFormat("bgHeight",regex.reg0,tips[0],70)) return false;
if(!checkFormat("bgTop",regex.reg1,tips[1],110)) return false;

if(!checkFormat("titleColor",regex.reg4,tips[4],"#fff")) return false;
if(!checkFormat("titleSize",regex.reg0,tips[3],25)) return false;
if(!checkFormat("titleTop",regex.reg1,tips[1],140)) return false;
if(!checkFormat("titleLeft",regex.reg1,tips[1],10)) return false;

if(!checkFormat("txtColor",regex.reg4,tips[4],"#fff")) return false;
if(!checkFormat("txtSize",regex.reg0,tips[3],15)) return false;
if(!checkFormat("txtTop",regex.reg1,tips[1],170)) return false;
if(!checkFormat("txtLeft",regex.reg1,tips[1],10)) return false;

createCanvas();
}

function checkFormat(id,reg,tip,defaultValue){
var node = _CalF.$('#'+id),
value = node.value;
if(!reg.test(value)){
alert(tip);
node.value = defaultValue;
node.focus();
return false;
}
return true;
}

//生成图片
function createIMG(){
if(onloadIMG){showImg
var imgSrc = canvas.toDataURL("image/png");
_CalF.$("#showImg").style.display = "block";
_CalF.$("#asImg").src = imgSrc;
}else{
alert("请选择图片!");
}
}

})();

</script>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: