您的位置 首页 > 攻略游记

<p>将颜色反转为灰度 </p>

大家好,今天来为大家解答

将颜色反转为灰度

这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

  • 如何区分图片的类型(可文件后缀名);
  • 如何获取图片的尺寸(可右键查看图片信息);
  • 如何预览本地图片(非图片阅读器);
  • 如何实现图片压缩(非图片压缩工具);
  • 如何操作位图像素数据(非 PS 等图片处理软件);
  • 如何实现图片隐写(非肉眼可见)。

十个图片处理 「“小帮手”」 已经已经迫不及待想与你见面,还在犹豫什么?赶紧出发吧!

目录

推荐10个常用的图片处理小帮手(上)「值得收藏」

推荐10个常用的图片处理小帮手(下)「值得收藏」 本篇

2.10 Sharp

High performance Node.js image processing, the fastest module to resize JPEG, PNG, WebP and TIFF images. Uses the libvips library.

https://github.com/lovell/sharp

Sharp 的典型应用场景是将常见格式的大图像转换为尺寸较小,对网络友好的 JPEG,PNG 和 WebP 格式的图像。由于其内部使用 libvips ,使得调整图像大小通常比使用 ImageMagick 和 GraphicsMagick 设置快 4-5 倍 。除了支持调整图像大小之外,Sharp 还支持旋转、提取、合成和伽马校正等功能。

Sharp 支持读取 JPEG,PNG,WebP,TIFF,GIF 和 SVG 图像。输出图像可以是 JPEG,PNG,WebP 和 TIFF 格式,也可以是未压缩的原始像素数据。

「使用示例」

//改变图像尺寸sharp(inputBuffer).resize(320,240).toFile('output.webp',(err,info)=>{...});//旋转输入图像并改变图片尺寸sharp('input.jpg').rotate().resize(200).toBuffer().then(data=>{...}).catch(err=>{...});

「在线示例」

https://segmentfault.com/a/1190000012903787

3.1 如何区分图片的类型

「计算机并不是通过图片的后缀名来区分不同的图片类型,而是通过 “魔数”(Magic Number)来区分。」 对于某一些类型的文件,起始的几个字节内容都是固定的,根据这几个字节的内容就可以判断文件的类型。

常见图片类型对应的模数如下表所示:

文件类型文件后缀魔数JPEGjpg/jpeg0xFFD8FFPNGpng0x89504E47GIFgif0x47494638(GIF8)BMPbmp0x424D

这里我们以阿宝哥的头像(abao.png)为例,验证一下该图片的类型是否正确:

在日常开发过程中,如果遇到检测图片类型的场景,我们可以直接利用一些现成的第三方库。比如,你想要判断一张图片是否为 PNG 类型,这时你可以使用 is-png 这个库,它同时支持浏览器和 Node.js,使用示例如下:

「Node.js」

//npminstallread-chunkconstreadChunk=require('read-chunk');constisPng=require('is-png');constbuffer=readChunk.sync('unicorn.png',0,8);isPng(buffer);//=>true

「Browser」

(async()=>{constresponse=awaitfetch('unicorn.png');constbuffer=awaitresponse.arrayBuffer();isPng(newUint8Array(buffer));//=>true})();

3.2 如何获取图片的尺寸

图片的尺寸、位深度、色彩类型和压缩算法都会存储在文件的二进制数据中,我们继续以阿宝哥的头像(abao.png)为例,来了解一下实际的情况:

528(十进制) =>0x0210

560(十进制)=>0x0230

因此如果想要获取图片的尺寸,我们就需要依据不同的图片格式对图片二进制数据进行解析。幸运的是,我们不需要自己做这件事,image-size 这个 Node.js 库已经帮我们实现了获取主流图片类型文件尺寸的功能:

「同步方式」

varsizeOf=require('image-size');vardimensions=sizeOf('images/abao.png');console.log(dimensions.width,dimensions.height);

「异步方式」

varsizeOf=require('image-size');sizeOf('images/abao.png',function(err,dimensions){console.log(dimensions.width,dimensions.height);});

image-size 这个库功能还是蛮强大的,除了支持 PNG 格式之外,还支持 BMP、GIF、ICO、JPEG、SVG 和 WebP 等格式。

3.3 如何预览本地图片

利用 HTML FileReader API,我们也可以方便的实现图片本地预览功能,具体代码如下:

在完成本地图片预览之后,可以直接把图片对应的 Data URLs 数据提交到服务器。针对这种情形,服务端需要做一些相关处理,才能正常保存上传的图片,这里以 Express 为例,具体处理代码如下:

constapp=require('express')();app.post('/upload',function(req,res){letimgData=req.body.imgData;//获取POST请求中的base64图片数据letbase64Data=imgData.replace(/^data:image\/\w+;base64,/,"");letdataBuffer=Buffer.from(base64Data,'base64');fs.writeFile("image.png",dataBuffer,function(err){if(err){res.send(err);}else{res.send("图片上传成功!");}});});

3.4 如何实现图片压缩

在一些场合中,我们希望在上传本地图片时,先对图片进行一定的压缩,然后再提交到服务器,从而减少传输的数据量。在前端要实现图片压缩,我们可以利用 Canvas 对象提供的 toDataURL() 方法,该方法接收 type 和 encoderOptions 两个可选参数。

其中 type 表示图片格式,默认为 image/png。而 encoderOptions用于表示图片的质量,在指定图片格式为 image/jpeg 或 image/webp的情况下,可以从 0 到 1 的区间内选择图片的质量。如果超出取值范围,将会使用默认值 0.92,其他参数会被忽略。

下面我们来看一下具体如何实现图片压缩:

functioncompress(base64,quality,mimeType){letcanvas=document.createElement("canvas");letimg=document.createElement("img");img.crossOrigin="anonymous";returnnewPromise((resolve,reject)=>{img.src=base64;img.onload=()=>{lettargetWidth,targetHeight;if(img.width>MAX_WIDTH){targetWidth=MAX_WIDTH;targetHeight=(img.height*MAX_WIDTH)/img.width;}else{targetWidth=img.width;targetHeight=img.height;}canvas.width=targetWidth;canvas.height=targetHeight;letctx=canvas.getContext("2d");ctx.clearRect(0,0,targetWidth,targetHeight);//清除画布ctx.drawImage(img,0,0,canvas.width,canvas.height);letimageData=canvas.toDataURL(mimeType,quality/100);resolve(imageData);};});}

对于返回的 Data URL 格式的图片数据,为了进一步减少传输的数据量,我们可以把它转换为 Blob 对象:

functiondataUrlToBlob(base64,mimeType){letbytes=window.atob(base64.split(",")[1]);letab=newArrayBuffer(bytes.length);letia=newUint8Array(ab);for(leti=0;i在转换完成后,我们就可以压缩后的图片对应的 Blob 对象封装在 FormData 对象中,然后再通过 AJAX 提交到服务器上:

functionuploadFile(url,blob){letformData=newFormData();letrequest=newXMLHttpRequest();formData.append("image",blob);request.open("POST",url,true);request.send(formData);}

3.5 如何操作位图像素数据

如果想要操作图片像素数据,我们可以利用 CanvasRenderingContext2D 提供的 getImageData 来获取图片像素数据,其中 getImageData() 返回一个 ImageData 对象,用来描述 canvas 区域隐含的像素数据,这个区域通过矩形表示,起始点为(sx, sy)、宽为 sw、高为 sh。其中 getImageData方法的语法如下:

ctx.getImageData(sx,sy,sw,sh);

相应的参数说明如下:

  • sx:将要被提取的图像数据矩形区域的左上角 x 坐标。
  • sy:将要被提取的图像数据矩形区域的左上角 y 坐标。
  • sw:将要被提取的图像数据矩形区域的宽度。
  • sh:将要被提取的图像数据矩形区域的高度。

在获取到图片的像素数据之后,我们就可以对获取的像素数据进行处理,比如进行灰度化或反色处理。当完成处理后,若要在页面上显示处理效果,则我们需要利用 CanvasRenderingContext2D 提供的另一个 API —— putImageData。

该 API 是 Canvas 2D API 将数据从已有的 ImageData 对象绘制到位图的方法。如果提供了一个绘制过的矩形,则只绘制该矩形的像素。此方法不受画布转换矩阵的影响。putImageData 方法的语法如下:

voidctx.putImageData(imagedata,dx,dy);voidctx.putImageData(imagedata,dx,dy,dirtyX,dirtyY,dirtyWidth,dirtyHeight);

相应的参数说明如下:

  • imageData: ImageData ,包含像素值的数组对象。
  • dx:源图像数据在目标画布中的位置偏移量(x 轴方向的偏移量)。
  • dy:源图像数据在目标画布中的位置偏移量(y 轴方向的偏移量)。
  • dirtyX(可选):在源图像数据中,矩形区域左上角的位置。默认是整个图像数据的左上角(x 坐标)。
  • dirtyY(可选):在源图像数据中,矩形区域左上角的位置。默认是整个图像数据的左上角(y 坐标)。
  • dirtyWidth(可选):在源图像数据中,矩形区域的宽度。默认是图像数据的宽度。
  • dirtyHeight(可选):在源图像数据中,矩形区域的高度。默认是图像数据的高度。

介绍完相关的 API,下面我们来举一个实际例子:

图片反色和灰度化处理
反色灰度化

需要注意的在调用 getImageData 方法获取图片像素数据时,你可能会遇到跨域问题,比如:

UncaughtDOMException:Failedtoexecute'getImageData'on'CanvasRenderingContext2D':Thecanvashasbeentaintedbycross-origindata.

对于这个问题,你可以阅读 「张鑫旭」 大神 “解决canvas图片getImageData,toDataURL跨域问题” 这一篇文章。

3.6 如何实现图片隐写

目前有多种方案可以实现图片隐写,以下是几种常见的方案:

  • 附加式的图片隐写;
  • 基于文件结构的图片隐写;
  • 基于 LSB 原理的图片隐写;
  • 基于 DCT 域的 JPG 图片隐写;
  • 数字水印的隐写;
  • 图片容差的隐写。

篇幅有限,这里我们就不继续展开,分别介绍每种方案。

本篇已完结

推荐JavaScript经典实例学习资料文章

《推荐10个常用的图片处理小帮手(上)「值得收藏」》

《JavaScript 中ES6代理的实际用例》

《12 个实用的前端开发技巧总结》

《一文带你搞懂搭建企业级的 npm 私有仓库》

《教你如何使用内联框架元素 IFrames 的沙箱属性提高安全性?》

《细说前端开发UI公共组件的新认识「实践」》

《细说DOM API中append和appendChild的三个不同点》

《细品淘系大佬讲前端新人如何上王者「干货」》

《一文带你彻底解决背景跟随弹窗滚动问题「干货」》

《推荐常用的5款代码比较工具「值得收藏」》

《Node.js实现将文字与图片合成技巧》

《爱奇艺云剪辑Web端的技术实现》

《我再也不敢说我会写前端 Button组件「实践」》

《NodeX Component - 滴滴集团 Node.js 生态组件体系「实践」》

《Node Buffers 完整指南》

《推荐18个webpack精美插件「干货」》

《前端开发需要了解常用7种JavaScript设计模式》

《浅谈浏览器架构、单线程js、事件循环、消息队列、宏任务和微任务》

《了不起的 Webpack HMR 学习指南(上)「含源码讲解」》

《了不起的 Webpack HMR 学习指南(下)「含源码讲解」》

《10个打开了我新世界大门的 WebAPI(上)「实践」》

《10个打开了我新世界大门的 WebAPI(中)「实践」》

《10个打开了我新世界大门的 WebAPI(下)「实践」》

《「图文」ESLint 在中大型团队的应用实践》

《Deno是代码的浏览器,你认同吗?》

《前端存储除了 localStorage 还有啥?》

《Javascript 多线程编程​的前世今生》

《微前端方案 qiankun(实践及总结)》

《「图文」V8 垃圾回收原来这么简单?》

《Webpack 5模块联邦引发微前端的革命?》

《基于 Web 端的人脸识别身份验证「实践」》

《「前端进阶」高性能渲染十万条数据(时间分片)》

《「前端进阶」高性能渲染十万条数据(虚拟列表)》

《图解 Promise 实现原理(一):基础实现》

《图解 Promise 实现原理(二):Promise 链式调用》

《图解 Promise 实现原理(三):Promise 原型方法实现》

《图解 Promise 实现原理(四):Promise 静态方法实现》

《实践教你从零构建前端 Lint 工作流「干货」》

《高性能多级多选级联组件开发「JS篇」》

《深入浅出讲解Node.js CLI 工具最佳实战》

《延迟加载图像以提高Web网站性能的五种方法「实践」》

《比较 JavaScript 对象的四种方式「实践」》

《使用Service Worker让你的 Web 应用如虎添翼(上)「干货」》

《使用Service Worker让你的 Web 应用如虎添翼(中)「干货」》

《使用Service Worker让你的 Web 应用如虎添翼(下)「干货」》

《前端如何一次性处理10万条数据「进阶篇」》

《推荐三款正则可视化工具「JS篇」》

《如何让用户选择是否离开当前页面?「JS篇」》

《JavaScript开发人员更喜欢Deno的五大原因》

《仅用18行JavaScript实现一个倒数计时器》

《图文细说JavaScript 的运行机制》

《一个轻量级 JavaScript 全文搜索库,轻松实现站内离线搜索》

《推荐Web程序员常用的15个源代码编辑器》

《10个实用的JS技巧「值得收藏」》

将颜色反转为灰度

" />

《细品269个JavaScript小函数,让你少加班熬夜(一)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(二)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(三)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(四)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(五)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(六)「值得收藏」》

《深入JavaScript教你内存泄漏如何防范》

《手把手教你7个有趣的JavaScript 项目-上「附源码」》

《手把手教你7个有趣的JavaScript 项目-下「附源码」》

《JavaScript 使用 mediaDevices API 访问摄像头自拍》

《手把手教你前端代码如何做错误上报「JS篇」》

《一文让你彻底搞懂移动前端和Web 前端区别在哪里》

《提高你的 JavaScript 技能10 个问答题》

《JavaScript图表库的5个首选》

《一文彻底搞懂JavaScript 中Object.freeze与Object.seal的用法》

《可视化的 JS:动态图演示 - 事件循环 Event Loop的过程》

《教你如何用动态规划和贪心算法实现前端瀑布流布局「实践」》

《可视化的 js:动态图演示 Promises & Async/Await 的过程》

《原生JS封装拖动验证滑块你会吗?「实践」》

《如何实现高性能的在线 PDF 预览》

《细说使用字体库加密数据-仿58同城》

《Node.js要完了吗?》

《Pug 3.0.0正式发布,不再支持 Node.js 6/8》

《纯JS手写轮播图(代码逻辑清晰,通俗易懂)》

《JavaScript 20 年 中文版之创立标准》

《值得收藏的前端常用60余种工具方法「JS篇」》

《箭头函数和常规函数之间的 5 个区别》

《通过发布/订阅的设计模式搞懂 Node.js 核心模块 Events》

《「前端篇」不再为正则烦恼》

《「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能》

《深入细品浏览器原理「流程图」》

《JavaScript 已进入第三个时代,未来将何去何从?》

《前端上传前预览文件 image、text、json、video、audio「实践」》

《深入细品 EventLoop 和浏览器渲染、帧动画、空闲回调的关系》

《推荐13个有用的JavaScript数组技巧「值得收藏」》

《前端必备基础知识:window.location 详解》

《不要再依赖CommonJS了》

《犀牛书作者:最该忘记的JavaScript特性》

《36个工作中常用的JavaScript函数片段「值得收藏」》

《Node + H5 实现大文件分片上传、断点续传》

《一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」》

《【实践总结】关于小程序挣脱枷锁实现批量上传》

《手把手教你前端的各种文件上传攻略和大文件断点续传》

《字节跳动面试官:请你实现一个大文件上传和断点续传》

《谈谈前端关于文件上传下载那些事【实践】》

《手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件》

《最全的 JavaScript 模块化方案和工具》

《「前端进阶」JS中的内存管理》

《JavaScript正则深入以及10个非常有意思的正则实战》

《前端面试者经常忽视的一道JavaScript 面试题》

《一行JS代码实现一个简单的模板字符串替换「实践」》

《JS代码是如何被压缩的「前端高级进阶」》

《前端开发规范:命名规范、html规范、css规范、js规范》

《【规范篇】前端团队代码规范最佳实践》

《100个原生JavaScript代码片段知识点详细汇总【实践】》

《关于前端174道 JavaScript知识点汇总(一)》

《关于前端174道 JavaScript知识点汇总(二)》

《关于前端174道 JavaScript知识点汇总(三)》

《几个非常有意思的javascript知识点总结【实践】》

《都2020年了,你还不会JavaScript 装饰器?》

《JavaScript实现图片合成下载》

《70个JavaScript知识点详细总结(上)【实践】》

《70个JavaScript知识点详细总结(下)【实践】》

《开源了一个 JavaScript 版敏感词过滤库》

《送你 43 道 JavaScript 面试题》

《3个很棒的小众JavaScript库,你值得拥有》

《手把手教你深入巩固JavaScript知识体系【思维导图】》

《推荐7个很棒的JavaScript产品步骤引导库》

《Echa哥教你彻底弄懂 JavaScript 执行机制》

《一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧》

《深入解析高频项目中运用到的知识点汇总【JS篇】》

《JavaScript 工具函数大全【新】》

《从JavaScript中看设计模式(总结)》

《身份证号码的正则表达式及验证详解(JavaScript,Regex)》

《浏览器中实现JavaScript计时器的4种创新方式》

《Three.js 动效方案》

《手把手教你常用的59个JS类方法》

《127个常用的JS代码片段,每段代码花30秒就能看懂-【上】》

《深入浅出讲解 js 深拷贝 vs 浅拷贝》

《手把手教你JS开发H5游戏【消灭星星】》

《深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】》

《手把手教你全方位解读JS中this真正含义【实践】》

《书到用时方恨少,一大波JS开发工具函数来了》

《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》

《手把手教你JS 异步编程六种方案【实践】》

《让你减少加班的15条高效JS技巧知识点汇总【实践】》

《手把手教你JS开发H5游戏【黄金矿工】》

《手把手教你JS实现监控浏览器上下左右滚动》

《JS 经典实例知识点整理汇总【实践】》

《简单几步让你的 JS 写得更漂亮》

《恭喜你获得治疗JS this的详细药方

《谈谈前端关于文件上传下载那些事【实践】》

《面试中教你绕过关于 JavaScript 作用域的 5 个坑》

《Jquery插件(常用的插件库)》

《【JS】如何防止重复发送ajax请求》

《JavaScript+Canvas实现自定义画板》

用户评论

十言i

终于看到这一篇了!上周刚学习了个图像编辑软件,感觉操作太复杂了... 这篇文章推荐的工具看着都挺简单易用的啊,有时间一定要试试看!

    有5位网友表示赞同!

ˉ夨落旳尐孩。

这个清单不错啊,很多之前听过名号,还没详细了解过。最吸引我的还是那个可以一键添加风景元素的软件,想象一下可以自己就能调出梦幻的感觉画面!

    有5位网友表示赞同!

凉笙墨染

说实话,大部分图片处理软件的功能都很类似,而且常常会遇到付费限制比较让人纠结... 这篇文章倒是把各个工具的特点总结得比较明确,有助于我选择合适的。希望能继续分享更多小众工具!

    有7位网友表示赞同!

温柔腔

我觉得这篇内容的重点不在于推荐哪个比较好,而是让大家了解这个领域的工具种类和各自特色,这样才能更好地找到适合自己的软件!

    有20位网友表示赞同!

拽年很骚

我一直在找一款可以快速编辑头像的工具,看看有没有合适的在这篇推荐里。话说能不能推荐一些专门处理人物照片的软件,比如修复皮肤问题啊什么的?

    有10位网友表示赞同!

微信名字

这10个工具大部分我没有听说过!看来图片处理领域还是有很多新兴的技术和工具,以后要多关注一下了。

    有19位网友表示赞同!

我的黑色迷你裙

对于新手来说,这篇推荐非常友好,每个工具都简要介绍一下功能,操作步骤也说明得很清楚。点赞!

    有12位网友表示赞同!

龙吟凤

这篇文章的排版真的挺舒服的,图片清晰分类很方便浏览。希望能更新更多更专业的工具!

    有8位网友表示赞同!

心安i

说实话,我很少会单独使用独立的图片处理软件,因为大部分现在都在手机APP里解决… 这篇文章里有些工具看起来很有前景,也许可以尝试下看看。

    有14位网友表示赞同!

空谷幽兰

最近在做一些设计工作,需要经常用到图像处理,这篇推荐来的正逢其时!希望能了解更多关于后期合成、滤镜等高级功能的介绍~

    有7位网友表示赞同!

别伤我i

我之前也是单纯认为图片处理就是修图一件事,直到尝试了一些工具才发现真是太多种多样了!这篇文章非常开我的眼界,以后可以多尝试不同的风格和效果!

    有13位网友表示赞同!

暖瞳

感觉这个列表还是比较偏向于专业领域的用户,对于普通用户来说,也许很多功能都不太实际。希望以后能出一期针对日常生活场景的图片处理工具推荐!

    有12位网友表示赞同!

苏樱凉

如果能够提供一些对比使用体验的文章,或者对各个工具进行更细致的功能解析,就更好了!我现在还不太清楚哪个工具更适合我的需求。

    有16位网友表示赞同!

关于道别

我最近尝试用了一些AI绘画软件来生成图像,感觉效果非常棒!但是处理这些生成的图片还需要用到专门的软件,这篇推荐里有没有类似的工具?

    有18位网友表示赞同!

呆檬

对于我们普通人来说,其实只需要一些简单易用的工具就能满足日常需求。希望以后能够分享更多功能轻量级、操作直观的图片处理小帮手!

    有17位网友表示赞同!

◆乱世梦红颜

这篇文章让我突然想起之前大学时学过的图像处理知识… 现在看来很多技术和软件都发生了很大变化,需要好好学习一下新的技能了!

    有9位网友表示赞同!

↘▂_倥絔

推荐的工具大多数都是付费版的?对于我们经常只是用来分享朋友圈的用户来说,一些免费功能强大的软件会更实用。

    有17位网友表示赞同!

雁過藍天

希望以后能看到更多关于图片处理技巧的文章,例如如何用专业的软件进行构图、调色等,这才是真正提升作品水平的关键!

    有5位网友表示赞同!

本站涵盖的内容、图片、视频等模板演示数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

备案号:滇ICP备2023006363号-20

网站地图