当前位置: 首页 > 编程日记 > 正文

canvas上的像素操作(图像复制,细调)

canvas上的像素操作(图像复制,细调)

总结

1、操作对象:ImageData 对象,其实是canvas的像素点集合

2、主要操作: var obj=ctx.getImageData(0,0,100,100);  ctx.putImageData(obj,110,0)

3、操作图片要放在站点才能正常操作,可以是本地站点可以是外部站点

4、属性有三个:宽、高、data

5、for循环给每一个像素点添加或者修改

6、不同的公式可以绘制任意奇妙的图形

像素操作

  • 属性
    • width 返回 ImageData 对象的宽度(可以理解为一行像素的个数)
    • height 返回 ImageData 对象的高度(可以理解为一列像素的个数)
    • data 返回一个对象,其包含指定的 ImageData 对象的图像数据
      • 该对象包含每一个像素的四个rgba值,注意每个值都在0-255之间
      • 这个四个参数和CSS中讲的rgba颜色表示法原理相同,四个参数分别表示红、绿、蓝以及透明度。
      • 所不同的是这里的透明度取值也是0-255,255表示完全不透明,0表示完全透明
  • 方法
    • getImageData(x,y,w,h) 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据
    • putImageData(imgData,dx,dy,dirtyX,dirtyY,w,h) 把图像数据(从指定的 ImageData 对象)放回画布

      首先讨论第一种最简单的putImageData用法,即putImageData(imgData,dirtyX,dirtyY),在解释其他参数

      • imgData 规定要放回画布的 ImageData 对象。
      • dx/dy ImageData 对象左上角的 x/y坐标,以像素计。即准备绘制图像的起点坐标.
      • [dirtyX,dirtyY,w,h]为一组可选参数,该参数确定了一个以dx和dy坐标原点的矩形,分别表示矩形的起点和宽高,该矩形把将要绘制的图像限定在矩形区域内.

        温馨提示:如果用绘入外部图片的办法测试该属性,在本地测试会出错,这是由于javaScript的同源策略对context.getImageDate的影响,该策略是基于浏览器的安全,禁用会造成安全隐患。可以通过搭建一个本地站点,将文档放到站点的方法测试。对于这一点在本课程中不做过多讲解。

    • createImageData() 创建新的、空白的 ImageData 对象
      • var imgData=context.createImageData(width,height);以指定的尺寸(以像素计)创建新的 ImageData 对象
      • var imgData=context.createImageData(imageData)创建与指定的另一个 ImageData 对象尺寸相同的新 ImageData 对象(不会复制图像数据)

代码

 1 <!DOCTYPE html>
 2 <html lang="zh-cn">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>8-19 课堂演示</title>
 6 </head>
 7 <style type="text/css">
 8 </style>
 9 <body>
10     <canvas id="canvas" width="500" height="300" style="background: #A9A9A9">
11             很抱歉,您的浏览器暂不支持HTML5的canvas
12     </canvas>
13     <script>
14         var c=document.getElementById("canvas");
15         var ctx=c.getContext("2d");
16         ctx.fillStyle='rgba(255,55,5,0.6)'
17         ctx.fillRect(0,0,100,100)
18         var obj=ctx.getImageData(0,0,100,100);
19         // alert(obj.width)
20         // alert(obj.height)
21         // alert(obj.data.length)
22         //每一个像素包含四个颜色分量
23         // alert(obj.data[0])
24         // alert(obj.data[1])
25         // alert(obj.data[2])
26         // alert(obj.data[3])
27 
28         ctx.putImageData(obj,110,0)
29         for (var i=0;i< obj.data.length; i++){
30             obj.data[0+4*i]=100;
31             obj.data[1+4*i]=20;
32             obj.data[2+4*i]=250;
33             obj.data[3+4*i]=255;
34         }
35 
36         ctx.putImageData(obj,220,0)
37         for (var i=0;i< obj.data.length; i++) {
38             obj.data[0+4*i]=Math.floor(Math.random()*255)
39             obj.data[1+4*i]=Math.floor(Math.random()*255)
40             obj.data[2+4*i]=Math.floor(Math.random()*255)
41             obj.data[3+4*i]=Math.floor(Math.random()*255)
42         }
43         ctx.putImageData(obj,330,0)
44 
45         for (var i=0;i< obj.data.length; i++) {
46             var rad=Math.floor(Math.random()*255)
47             obj.data[0+4*i]=rad
48             obj.data[1+4*i]=rad
49             obj.data[2+4*i]=rad
50             obj.data[3+4*i]=rad
51         }
52         ctx.putImageData(obj,330,150)
53 
54 
55     </script>
56         
57 </body>
58 </html>
View Code

操作图片

放在站点才能正常操作

 1 <!DOCTYPE html>
 2 <html lang="zh-cn">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>8-21 课堂演示</title>
 6 </head>
 7 <style type="text/css">
 8 </style>
 9 <body>
10     <canvas id="canvas" width="900" height="300" style="background: #A9A9A9">
11             很抱歉,您的浏览器暂不支持HTML5的canvas
12     </canvas>
13     <input type="button" value="像素操作" onclick="putImage()">
14     <input type="button" value="反色绘制" onclick="fs()">
15     <input id="ljxg" type="button" value="滤镜效果" onclick="lj()">
16     <script>
17         var c=document.getElementById("canvas");
18         var ctx=c.getContext("2d");
19         var img=new Image();
20         img.onload=function(){
21             ctx.drawImage(img,0,0,400,300)
22         }
23         img.src='../img/p3.jpg'
24         function putImage()    {
25             var imgData=ctx.getImageData(0,0,400,300) //用getImageData函数从画板上取得像素数据
26             //ctx.putImageData(imgData,500,0)  //将所取得的整个像素数据画到Canvas画板上
27             //将所取得的像素数据的一部分画到Canvas画板上。
28             //ctx.putImageData(imgData,500,0,150,0,130,300)
29             //ctx.putImageData(imgData,500,0,300,0,130,300)
30             ctx.putImageData(imgData,500,0,0,0,130,300)
31         }
32 
33         //反色绘制
34         function fs(){
35             ctx.clearRect(500,0,400,300)
36             var imgData=ctx.getImageData(0,0,400,300)
37             for (var i=0;i<imgData.data.length ; i+=4) {
38                 imgData.data[i+0]=255-imgData.data[i+0];
39                 imgData.data[i+1]=255-imgData.data[i+1]
40                 imgData.data[i+2]=255-imgData.data[i+2]
41             }
42             ctx.putImageData(imgData,500,0) 
43         }
44 
45         //滤镜效果
46         function lj(){
47             ctx.clearRect(500,0,400,300)
48             var imgData=ctx.getImageData(0,0,400,300)
49             for (var i=0;i<imgData.data.length ; i+=4) {
50                 imgData.data[i+0]=0;
51                 //imgData.data[i+1]=0;
52                 // imgData.data[i+2]=0;
53             }
54             ctx.putImageData(imgData,500,0) 
55         }
56     </script>
57         
58 </body>
59 </html>
View Code

绘制背景

 1 <!DOCTYPE html>
 2 <html lang="zh-cn">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>8-22 课堂演示</title>
 6 </head>
 7 <style type="text/css">
 8 </style>
 9 <body>
10     <canvas id="canvas" width="900" height="300" style="background: #A9A9A9">
11             很抱歉,您的浏览器暂不支持HTML5的canvas
12     </canvas>
13     <script>
14         var c=document.getElementById("canvas");
15         var ctx=c.getContext("2d");
16         var imgData=ctx.createImageData(300,300);
17         for (var i=0;i<imgData.data.length;i+=4){
18             var g=i*i*i*3%255
19               imgData.data[i+0]=g;
20               imgData.data[i+1]=g;
21              imgData.data[i+2]=g;
22               imgData.data[i+3]=255;
23         }
24         ctx.putImageData(imgData,0,0);
25 
26         for (var i=0;i<imgData.data.length;i+=4)
27           {
28                     g=Math.floor((i*i+4*i+30)%255)
29                       imgData.data[i+0]=g;
30                       imgData.data[i+1]=g;
31                      imgData.data[i+2]=255;
32                       imgData.data[i+3]=255;
33         }
34         ctx.putImageData(imgData,300,0);
35 
36         for (var i=0;i<imgData.data.length;i+=4)
37           {
38                     g=Math.floor(Math.sqrt(i*i*5)%255)
39                       imgData.data[i+0]=200;
40                       imgData.data[i+1]=g;
41                      imgData.data[i+2]=g;
42                       imgData.data[i+3]=255;
43         }
44         ctx.putImageData(imgData,600,0);
45     </script>
46         
47 </body>
48 </html>
View Code

 

转载于:https://www.cnblogs.com/Renyi-Fan/p/8142346.html

相关文章:

sql查询返回xml数据之应用【转载】

sql查询返回xml数据之应用【转载】 今天查看邮件&#xff0c;看到一标题Using the FOR XML Clause to Return Query Results as XML&#xff0c;点进去看了看&#xff0c;以前也是知道sql server 查询可以返回xml格式&#xff0c;但具体一到应用中比较少&#xff0c;读过文章后…

solr 实现对经纬度的查询

1、solr版本 solr7 2、solr 经纬度查询的方式 使用LatLonType(用于平面坐标&#xff0c;而不是大地坐标&#xff09;SpatialRecursivePrefixTreeFieldType&#xff08;缩写为RPT&#xff09;BBoxField&#xff08;用于边界索引查询&#xff09;2.1 使用 LatLonPointSpatialF…

win7关于IIS发布网站时候数据库的问题,xp也一样

Win7装iis极其简单. 添加ASP.NET网站时应该选择添加"添加应用程序" 如果要连接sql server会报错,说是 "无法打开登录所请求的数据库 "MarketDept"。登录失败。用户 IIS APPPOOL\DefaultAppPool 登录失败。" 而系统中根本不会存在这个用户的. 解决…

Linq 等式运算符:SequenceEqual

检查元素的数量&#xff0c;每个元素的值及两个集合中元素的顺序是否相等,3个方面都相等则为true,否则为false IList<string> strList1 new List<string>(){"One", "Two", "Three", "Four", "Three"};IList<…

Swing 实现聊天系统 私发与群发

该系统使用的了socket、swing相关知识&#xff0c;实现了一个简单的群聊和私聊的系统。 1、程序界面功能展示 服务端swing界面展示 客户端服务展示 用户上线与发送消息客户端与服务端 私发消息 相关代码&#xff1a; package frame;import java.awt.BorderLayout; import ja…

Http和Socket连接区别(ZT)

1、TCP连接 要想明白Socket连接&#xff0c;先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议&#xff0c;可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口&#xff0c;使上层网络数据的传输建立在“无差别”的网络之上。 建立起一…

函数传参涉及到副本的创建与拷贝问题分析

遇到一个问题,是这样的: b [1, 2, 3]def aaa(b):b.append(4)def bbb(b):b 5aaa(b) print(b) # [1, 2, 3, 4]bbb(b) print(b) # [1, 2, 3, 4] 为什么呢,为什么通过函数传参,去修改参数,结果不一致呢? 原因是因为函数传参涉及到了参数副本的创建与拷贝,具体详解: 圆圈2为传参…

网页鼠标滚动实现图片缩放

<SCRIPT LANGUAGE"JavaScript"><!--//图片按比例缩放,可输入参数设定初始大小function resizeimg(ImgD,iwidth,iheight) {var p_w_picpathnew Image();p_w_picpath.srcImgD.src;if(p_w_picpath.width>0 && p_w_picpath.height>0){if(p_w_picp…

Dubbo 2.7.1 踩坑记

Dubbo 2.7 版本增加新特性&#xff0c;新系统开始使用 Dubbo 2.7.1 尝鲜新功能。使用过程中不慎踩到这个版本的 Bug。 系统架构 Spring Boot 2.14-Release Dubbo 2.7.1 现象 Dubbo 服务者启动成功&#xff0c;正常提供服务&#xff0c;消费者调用偶现失败的情况。错误如下图: …

经典算法研究系列:二、Dijkstra 算法初探

经典算法研究系列&#xff1a;二、Dijkstra 算法初探 July 二零一一年一月 本文主要参考&#xff1a;算法导论 第二版、维基百科。 写的不好之处&#xff0c;还望见谅。本经典算法研究系列文章&#xff0c;永久勘误&#xff0c;永久更新、永久维护。 July、二零一一年二月…

[Python Study Notes] Python的安装

Windows&#xff1a; 1.下载安装包&#xff1a; 转到Python官网https://www.python.org/downloads/ &#xff0c;下载最新版本的Python。 2.安装 安装到自定义的安装路径下。 3.配置环境变量 安装完成后--》【右键快捷方式】--》【复制python路径】&#xff0c;例如&#xff1…

swing 实现电影选座系统

该系统使用swing数据库 实现一个电影选座系统&#xff0c;相关系统的截图如下 使用三层架构实现电影购票系统&#xff0c;分用户和管理员&#xff0c;用户功能:展示电影&#xff0c;查找电影(模糊查询)&#xff0c;查看电影详情&#xff0c;查找场次&#xff0c;购买影票&…

JS动态加载JS

1、直接document.write <script language"javascript"> document.write("<script srctest.js><\/script>"); </script> 2、动态改变已有script的src属性 <script src id"s1"></script> <script lang…

PAT乙级1037

1037 在霍格沃茨找零钱 (20 分)如果你是哈利波特迷&#xff0c;你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的&#xff1a;“十七个银西可(Sickle)兑一个加隆(Galleon)&#xff0c;二十九个纳特(Knut)兑一个西可&#xff0c;很容易。”现在&#xff0c;给定哈利…

SAD和SATD的区别[摘]

Q:如果不用率失真最优化&#xff0c;为什么选择SATD&#xff0b;deltar&#xff08;mv&#xff0c;mode&#xff09;作为模式选择的依据&#xff1f;为什么运动估计中&#xff0c;整象素搜索用SAD&#xff0c;而亚象素用SATD&#xff1f;为什么帧内模式选择要用SATD&#xff1f…

照片换色 使用Python 或者 java

记录使用第三方api 给照片换底色&#xff0c;智能抠图。 1、第三方接口地址 https://www.remove.bg/api 2、抠图效果 3、使用python 实现的代码 在网页换色是不需要进行注册的&#xff0c;如果自己开发 需要注册账号 &#xff0c;得到调取api的口令 import requests impor…

WEB安全,SQL注入漏洞的加固代码汇总

该修复任务专用于处理以下安全性问题&#xff1a;[1] SQL 盲注[2] SQL 注入[3] XPath 注入[4] 发现数据库错误模式[5] 跨站点脚本编制[6] 使用 SQL 注入的认证旁路[7] HTTP 响应分割[8] 链接注入&#xff08;便于跨站请求伪造&#xff09;详细信息若干问题的补救方法在于对用户…

mui ios中form表单中点击输入框头部导航栏被推起及ios中form表单中同时存在日期选择及输入框时,日历选择页面错乱bug...

一、ios header导航栏被推起解决方法 1 设置弹出软键盘时自动改变webview的高度 plus.webview.currentWebview().setStyle({ softinputMode: "adjustResize" // 弹出软键盘时自动改变webview的高度 }); 2 增加样式 html, body { height: 100%; margin: 0px; …

qt试用1(Eclipse+cdt+Qt)

下载eclipse-cpp-helios-SR1-win32.zip下载Qt下载qt-eclipse-integration-win32-1.6.1.exe写一个启动eclipse的batch文件C:\program\eclipse-cpp-helios-SR1-win32\eclipse\cdt.batset path%path%;C:\Qt\2010.05\mingw\binset LIBRARY_PATHC:\Qt\2010.05\mingw\libset C_INCLUD…

Solr 中遇到的问题

1、问题1 &#xff1a;whose UTF8 encoding is longer than the max length 32766 Error from server at http://localhost:8983/solr/newcore: Exception writing document id 995 to the index; possible analysis error: Document contains at least one immense term in f…

【推荐】Flex+asp.net上传文件

前台Flex文件&#xff1a;UploadSample.mxml&#xff0c;其代码如下所示&#xff1a; 1 <?xml version"1.0" encoding"utf-8"?>2 <mx:Application xmlns:mx"http://www.adobe.com/2006/mxml"layout"absolute">3 <mx:…

Centos查找命令清单

查找目录&#xff1a;find /&#xff08;查找范围&#xff09; -name 查找关键字 -type d查找文件&#xff1a;find /&#xff08;查找范围&#xff09; -name 查找关键字 -print 如果需要更进一步的了解&#xff0c;可以参看Linux的命令详解。 这里摘抄如下&#xff1a; find …

docker 安装使用 solr

目录 1、安装solr 7.5 2、启动solr服务 2.1 创建一个solr库 3、配置IK分词器 4、docker 配置solr登录密码 1、安装solr 7.5 docker solr 官网&#xff1a;https://hub.docker.com/_/solr/ docker pull solr:7.5.0 2、启动solr服务 docker run --name my_solr -d -p 898…

2010中国城市GDP排名

1、上海市 14900.93亿元 8.2&#xff05; 上海 2、北京市 11865.9亿元 10.1% 北京 3、广州市 9118.6亿元 11% 广东1 4、深圳市 8245亿元 10.5% 广东2 5、天津市 7500亿元 16.5% 天津 6、苏州市 7400亿元 11% 江苏1 7、重庆市 5856亿元 14.9% 重庆 8、杭州市 5098.66亿元 10% 浙…

基于wsimport生成代码的客户端

概述 wsimport是jdk自带的命令&#xff0c;可以根据wsdl文档生成客户端中间代码&#xff0c;基于生成的代码编写客户端&#xff0c;可以省很多麻烦。wsimport命令 wsimport的用法 wsimport [options] <WSDL_URI>比较常用的[options]有&#xff1a;1. -d <directory>…

C# Trim 的使用

C# 移除字符 /// <summary> /// 删除指定字符 /// </summary> /// <returns>返回经过修饰的字符串</returns> private string DelChar() { string mess " Test Program "; // 测试字符 if (mess ! string.Empty) …

CSS截取字符串,兼容浏览器

今天在经典论坛看到有同学问到CSS截取字符多余省略号代替的求助且要兼容FF... 这个的确是个比较头痛的问题&#xff0c;现在我在的公司都是程序截取显示省略符的。兼容是没问题&#xff0c;但在中文和数学或字母混排时&#xff0c;就会有点小小的视觉缺陷。在程序截取中&#x…

SQL Server Alwayson 主从数据库账号同步

我们建立了Alwayson后&#xff0c;辅助副本下的数据库是没有相应的账号的&#xff0c;怎么样进行账号的同步呢&#xff1f;怎么在不知道密码的情况下&#xff0c;进行账号的同步设置。 我们可以通过SP--sp_help_revlogin 来实现&#xff0c;此存储过程在主副本上创建了&#xf…

Python 使用 Flask框架记录

Python 使用 Flask框架记录 1、安装Flask ​ Flask依赖两个外部库&#xff0c;Werkzeug和Jinja2&#xff0c;Werkzeug是一个WSGI(服务器网关接口)。Jinja2时负责渲染模板。在安装Flask之前需要安装这俩个外部库&#xff0c;最简单的安装方式是使用Vritualenv创建虚拟环境。 …

java8学习之Lambda表达式深入与流初步

Lambda表达式深入&#xff1a; 在上一次【http://www.cnblogs.com/webor2006/p/8135873.html】中介绍Lambda表达式的作用时&#xff0c;其中说到这点&#xff1a; 如标红处所说&#xff0c;既然Lambda表达式是一个对象&#xff0c;而且必须依附于一类特别的对象类型叫函数式接口…