在HTML5中如何利用Canvas处理并存储图片
HTML5中增加的Canvas元素,配合JS灵活的语法,处理起图片变得异常简单,不需要在客户端用C/C 写一大堆代码,对于熟悉JS的程序员来说,只需要考虑处理图片的逻辑了。
canvas中如果想要处理图片就需要借助ImageData这个对象,就是将画布中某一区域中的图像以RGBA的方式保存下来,存成一个二维数组。
JavaScript
ctx.getImageData( x, y, w, h) //获取ImageData
ctx.putImageData( x, y, w, h) //将ImageData绘在画布上
写了个简单的处理图像的类,可以翻转/灰化/去色/高亮/设单色值
JavaScript
/**
* @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();
通过一系列操作,渲染好图像后,就需要借助如下的代码将画布中的图像保存成图片
JavaScript
//将图像输出为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中的代码如下:
JavaScript
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
在HTML5中如何利用Canvas处理并存储图片相关推荐
- html5 canvas 椭圆,html5中怎么利用Canvas绘制椭圆
html5中怎么利用Canvas绘制椭圆 发布时间:2021-07-08 16:32:10 来源:亿速云 阅读:58 作者:Leah html5中怎么利用Canvas绘制椭圆,针对这个问题,这篇文章详 ...
- html5中怎么使用canvas画空心圆与实心圆
这篇文章主要介绍"html5中怎么使用canvas画空心圆与实心圆"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"html5中怎么 ...
- 移动端html5手写板,Vue利用canvas实现移动端手写板的方法
清除 保存 Canvas画板 var draw; var preHandler = function(e){e.preventDefault();} class Draw { constructor( ...
- 日常生活中怎样利用计算机的,数据存储与管理在日常生活中的三种方式
数据存储与管理在使用的时候还是有很多的技术性要求需要我们不断的学习和实践.下面是在长时间的市场积累中总结出来的一些关于数据存储与管理的技巧. 过去20年里,计算领域发生了很大的变化,无论如何变化,计算 ...
- 爬取图片到mysql数据库_爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片...
前言 由于硬件等各种原因需要把大概170多万2t左右的微博图片数据存到Mysql中.之前存微博数据一直用的非关系型数据库mongodb,由于对Mysql的各种不熟悉,踩了无数坑,来来回回改了3天才完成 ...
- 爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片
本人长期出售超大量微博数据.旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com.同时欢迎加入社交媒体数据交流群:99918768 前言 ...
- 如何利用七牛云在线存储图片
平时写学习笔记和博客文章的时候早已习惯了使用 Markdown 记录,各种方便,但图片的保存和展示成了一个比较关键的问题,虽然可以使用本地相对路径显示图片,但也很不方便,总不能一直是单机版吧.七牛云是 ...
- html5水池,分享用canvas实现水流和水池动画的代码
利用Html 5的canvas标签绘制水流和水池动画 在利用HTML 5的canvas进行动画绘制之前,首先先介绍一下基本知识,包括canvas(如果对canvas比较熟悉的可以直接跳过该节).oCa ...
- 小程序uniapp利用canvas生成海报并可以保存至相册
✨uniapp实现生成海报并保存至相册组件,u-popup可以根据自己所使用的组件进行替换 这里主要讲的是JS部分,css和元素相关的就不展开赘述了,下方先给大伙看看效果图,图的下方有代码讲解,最下方 ...
最新文章
- 苹果回应“远程扫描用户相册”:声明被广泛误解,未设后门,功能仅美国可用...
- AV1为何有信心打败H.265?
- [Qt教程] 第20篇 2D绘图(十)图形视图框架(下)
- css 选择href属性值,巧用CSS属性值正则匹配选择器(小技巧)
- 深入理解 JVM Class文件格式(七)
- vue 组件属性监听_vuejs组件内的对象属性监听问题
- cycleGAN的改进文章(CyCADA + U-GAT-IT)
- 北航计算机2014复试上机题,北航计算机系考研复试上机真题及答
- Spring中定义Bean的6种方式(声明式+编程式)
- 一、计算机系统基础知识
- TeamTalk Base静态库说明
- 江苏省无锡市高二计算机小高考,江苏新高考高二还要考小高考吗?江苏新高考高中怎么分科?...
- Table ‘xxx‘ is specified twice, both as a target for ‘UPDATE‘ and as a separate source for data
- 强化调色原理—制作老旧照片效果
- 2009 year English Inprovement for IT developments
- python3模拟键盘输入_python 模拟键盘输入
- 循环语句介绍(笔记学习)
- xxxxxxxxxxxxxx
- PHP正则表达式提取html超链接中的h…
- VC++游戏编程----游戏画面特效制作2