HTML5中增加的Canvas元素,配合JS灵活的语法,处理起图片变得异常简单,不需要在客户端用C/C++写一大堆代码,对于熟悉JS的程序员来说,只需要考虑处理图片的逻辑了。
canvas中如果想要处理图片就需要借助ImageData这个对象,就是将画布中某一区域中的图像以RGBA的方式保存下来,存成一个二维数组。
- ctx.getImageData( x, y, w, h) //获取ImageData
- ctx.putImageData( x, y, w, h) //将ImageData绘在画布上
写了个简单的处理图像的类,可以翻转/灰化/去色/高亮/设单色值
- /**
- * @author Norris Tong
- */
- var PS = function( config ){
- //$.extend( this, config );
- return this;
- }
- PS.prototype = {
- //将图像灰化
- gray : function( ctx, imageData ){
- var w = imageData.width,
- h = imageData.height,
- ret = ctx.createImageData( w, h );
- for (i=0; i<w; i++)
- {
- for (j=0; j<h; j++)
- {
- var index=(i*h+j) * 4;
- var red=imageData.data[index];
- var green=imageData.data[index+1];
- var blue=imageData.data[index+2];
- var alpha=imageData.data[index+3];
- var average=(red+green+blue)/3;
- ret.data[index]=average;
- ret.data[index+1]=average;
- ret.data[index+2]=average;
- ret.data[index+3]=alpha;
- }
- }
- return ret;
- },
- // 生成ImageData
- createImageData : function( ctx, ori, from, w, h ){
- var ret = ctx.createImageData( w, h );
- var total = w * h * 4;
- from = from * w * 4;
- for (var i= 0 ; i< total; i++) {
- ret.data[ i ] = ori.data[ from + i ];
- }
- return ret;
- },
- //生成ImageData
- //对称图像反转
- createImageDataTurn : function( ctx, ori, from, w, h ){
- var ret = ctx.createImageData( w, h );
- var total = w * h * 4;
- from = from * w * 4;
- for (var j=0; j<h; j++) {
- for (var i=0; i<w; i++) {
- var a = (j * w + i) * 4,
- b = from + a,
- c = (j * w + w- i) * 4;
- ret.data[ c++ ] = ori.data[ b++ ];
- ret.data[ c++ ] = ori.data[ b++ ];
- ret.data[ c++ ] = ori.data[ b++ ];
- ret.data[ c++ ] = ori.data[ b++ ];
- }
- }
- return ret;
- },
- //将整个图片设置为某一颜色值
- setColorR : function( ctx, imageData, n ){
- var w = imageData.width,
- h = imageData.height,
- ret = ctx.createImageData( w, h );
- var total = w * h * 4;
- for (var i=0; i<total; i +=4 ) {
- ret.data[i] = n; // imageData[ i ];
- ret.data[i+1]= imageData.data[ i + 1 ];
- ret.data[i+2]= imageData.data[ i + 2 ];
- ret.data[ i+3]= imageData.data[ i + 3 ];
- }
- return ret;
- },
- //将整个图片设置为某一颜色值
- setColorG : function( ctx, imageData, n ){
- var w = imageData.width,
- h = imageData.height,
- ret = ctx.createImageData( w, h );
- var total = w * h * 4;
- for (var i=0; i<total; i +=4 ) {
- var red=imageData.data[i],
- green=imageData.data[i+1],
- blue=imageData.data[i+2];
- var a = (red + green + blue) / 3;
- ret.data[i] = a;
- ret.data[i+1]= a + n;
- ret.data[i+2]= a;
- ret.data[ i+3]= imageData.data[ i + 3 ];
- }
- return ret;
- },
- //将整个图片设置为某一颜色值
- setColorB : function( ctx, imageData, n ){
- var w = imageData.width,
- h = imageData.height,
- ret = ctx.createImageData( w, h );
- var total = w * h * 4;
- for (var i=0; i<total; i +=4 ) {
- ret.data[i] = imageData.data[ i ];
- ret.data[i+1]= imageData.data[ i + 1 ];
- ret.data[i+2]= n;
- ret.data[ i+3]= imageData.data[ i + 3 ];
- }
- return ret;
- },
- //高亮整个图片
- highlight : function( ctx, imageData, n ){
- var w = imageData.width,
- h = imageData.height,
- ret = ctx.createImageData( w, h );
- var total = w * h * 4;
- for (var i=0; i<total; i +=4 ) {
- ret.data[i] = imageData.data[ i ] + n;
- ret.data[i+1]= imageData.data[ i + 1 ] + n;
- ret.data[i+2]= imageData.data[ i + 2 ] + n;
- ret.data[ i+3]= imageData.data[ i + 3 ];
- }
- return ret;
- },
- //去色 紫色 247, 0, 255
- removeColor : function( ctx, imageData, r, g, b ){
- var w = imageData.width,
- h = imageData.height,
- ret = ctx.createImageData( w, h );
- var total = w * h * 4;
- for (var i=0; i<total; i +=4 ) {
- var red=imageData.data[i],
- green=imageData.data[i+1],
- blue=imageData.data[i+2];
- //相等则全透明
- if ( r == red && green == g && blue == b ){
- ret.data[ i+3]= 0;
- }else{
- ret.data[i] = red;
- ret.data[i+1]= green;
- ret.data[i+2]= blue;
- ret.data[ i+3]= imageData.data[ i + 3 ];
- }
- }
- return ret;
- }
- };
- PS = new PS();
通过一系列操作,渲染好图像后,就需要借助如下的代码将画布中的图像保存成图片
- //将图像输出为base64压缩的字符串 默认为image/png
- var data = canvas.toDataURL();
- //删除字符串前的提示信息 "data:image/png;base64,"
- var b64 = data.substring( 22 );
- //POST到服务器上,生成图片
- $.post( "save.aspx" , { data : b64, name : filename }, function(){
- //OK
- });
save.aspx中的代码如下:
- protected void Page_Load(object sender, EventArgs e)
- {
- if (Request["name"] != null)
- {
- string name = Request["name"];
- String savePath = Server.MapPath("~/images/output/");
- try
- {
- FileStream fs = File.Create(savePath + "/" + name);
- byte[] bytes = Convert.FromBase64String(Request["data"]);
- fs.Write(bytes, 0, bytes.Length);
- fs.Close();
- }
- catch (Exception except)
- {
- }
- }
- }
PS: 由于沙箱的限制,想在浏览器端通过JS直接存为本地图片,似乎是不大可能,现在网上较为折中的方式为
window.location.href = "image/octet-stream" + data
但这种方式不能指定保存的文件名,在FF下默认是xxxxx.part
相关推荐
HTML2canvas是一个JavaScript库,它的...通过查看和分析这个demo,开发者可以学习到如何更有效地利用html2canvas库,解决实际开发中的问题,提高工作效率。同时,这个demo也可以作为一个模板,为其他类似需求提供参考。
HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式2D内容。这个“html5 canvas 游戏”是一个基于HTML5 Canvas技术开发的小游戏,主题是“兔子吃萝卜”,展示了...
这里我们关注的是如何利用DOM(Document Object Model)和Canvas API将HTML内容转化为Canvas图像,进一步转换为base64编码的图片。这个过程通常涉及到以下几个关键知识点: 1. DOM (Document Object Model): DOM...
Canvas是HTML5中的一个核心元素,允许在网页上动态绘制图形,就像一个画布。JavaScript作为客户端脚本语言,与HTML5和Canvas结合,可以创建出丰富的交互式用户界面,包括图像处理功能,如头像的缩放和裁剪。 头像...
Daycaca是一款强大的JavaScript图片处理类库,它充分利用HTML5中的Canvas元素,为开发者提供了便捷的图片压缩和裁剪功能。在Web开发中,尤其是在用户上传图片或者需要进行实时图片处理的场景下,Daycaca扮演着至关...
标题 "一款基于 Html5、Canvas 的图片编辑器.zip" 提示我们关注的是一个利用 HTML5 和 Canvas 技术实现的图片编辑工具。HTML5 是一种先进的网页开发标准,它极大地扩展了网页内容的表现形式和交互性。Canvas 是 ...
在这个"HTML5 canvas星星连线"的项目中,利用canvas结合JavaScript技术,实现了用户通过鼠标移动时在屏幕上连接星星的效果,营造出一种梦幻般的星空画面。 首先,我们来了解一下HTML5 canvas的基本概念。canvas是一...
综上所述,这个压缩包提供的代码示例展示了如何利用HTML5 Canvas技术开发一个互动的儿童填色游戏,涵盖了图形绘制、事件处理、数据管理等多个方面,是学习和理解HTML5 Canvas应用的一个很好的实例。通过研究这个游戏...
本书《HTML5 Canvas游戏开发实战》由张路斌(lufy_legend)编写,深入浅出地讲解了如何利用HTML5 Canvas进行游戏开发,结合提供的源码实例,读者可以更直观地学习和理解相关技术。 1. **HTML5 Canvas基础** - ...
1. HTML5:HTML5是超文本标记语言的第五个版本,它引入了许多新特性,如语义化标签(如、等)、离线存储(离线Web应用程序)、拖放功能、媒体元素(、)以及Canvas等。在这个项目中,HTML5被用来构建页面结构,并与...
通过上述讲解,我们可以理解如何利用HTML5 Canvas来实现全屏背景动画特效。实际项目中,你可以从提供的7款特效中学习和借鉴,结合自己的创意,创造出更多独特且引人入胜的视觉体验。在实践中不断探索和提升,将使你...
在HTML5中,`<canvas>`元素是一个矩形区域,我们可以在这个区域内通过JavaScript API进行绘图。Canvas API提供了一系列的方法,如`fillRect()`, `strokeRect()`, `beginPath()`, `moveTo()`, `lineTo()`, `arc()`等...
HTML5+JS游戏开发模块中的图片拖放功能是利用HTML5的新特性,特别是Canvas元素,结合JavaScript编程实现的。Canvas是HTML5中的一个强大的绘图工具,允许开发者在网页上进行动态图形绘制,包括图像的移动、旋转、缩放...
标题中的“使用CANVAS将网页以图片的格式存到服务器端”是指利用HTML5的Canvas元素,配合JavaScript技术,将当前网页的可视内容捕获并转换为图像文件,然后通过Ajax或其他HTTP请求发送到服务器进行存储。这个过程...
5. 存储和展示:生成的Base64图片数据可以直接插入到HTML的`<img>`标签中显示,也可以保存到服务器或者本地存储。 在提供的压缩包文件"KatexConvertImg"中,可能包含了示例代码、样式文件或其他资源,用于帮助...
Canvas是HTML5中的一个画布元素,它允许开发者通过JavaScript来绘制2D图形,包括动态动画。在这款游戏中,Canvas成为了展示游戏画面和交互效果的主要舞台。开发者可以通过调用Canvas的API,如`fillRect()`、`...
H5 Canvas是HTML5中的一个强大元素,它允许开发者在网页上进行图形绘制和处理,非常适合创建各种动态效果。 ### 一、Canvas API简介 Canvas是HTML5中引入的一个绘图工具,它提供了一个二维画布,通过JavaScript来...
这里我们将深入探讨如何利用HTML5的Canvas API来实现这一功能。 首先,`canvas`是HTML5提供的一种强大的图形处理元素,它允许我们在网页中动态绘制图形,包括图片。要使用Canvas压缩图片,我们首先要创建一个`...
在这个"html5+canvas+jquery拼图游戏实例"中,我们看到的是如何利用这些技术来创建一个有趣的游戏体验。Canvas是HTML5的一个核心元素,它允许开发者在网页上进行动态图形绘制,而jQuery则是一个流行的JavaScript库,...