JS+CSS3手写滤镜,皮一下还是很开心的

用原生JS写了一个关于图片预览和调色,并保存调色之后的图片。
首先,先在css中设置默认的初始滤镜,使用css3中的filter特性:

 #img{
        -webkit-filter: grayscale(0%) brightness(100%) contrast(100%) saturate(100%);
        filter: grayscale(0%) brightness(100%) contrast(100%) saturate(100%);
 }

html

<input id="file" type="file" onchange="preview(this)">
    <p></p>
    <div>
        <img id="img" width="400"/>
    </div>
    <div>
        <label>灰度:</label>
        <input type="range" min="0" max="200" value="0" id="grayscale" onmousemove="changeValue(1)">
        <span id="grayscaleText">0%</span>
    </div>
    <div>
        <label>亮度:</label>
        <input type="range" min="0" max="200" value="100" id="brightness" onmousemove="changeValue(2)">
        <span id="brightnessText">100%</span>
    </div>
    <div>
        <label>对比度:</label>
        <input type="range" min="0" max="200" value="100" id="contrast" onmousemove="changeValue(3)">
        <span id="contrastText">100%</span>
    </div>
    <div>
        <label>饱和度:</label>
        <input type="range" min="0" max="200" value="100" id="saturate" onmousemove="changeValue(4)">
        <span id="saturateText">100%</span>
    </div>
    <p></p>
    <button onclick="downloadImg()">保存图片</button>

简易html如下:


html页面

在js中添加预览函数:

//    图片预览
    function preview(file){
        const img = document.getElementById('img');
        if(file.files && file.files[0]){
            const reader = new FileReader();
            reader.onload = function(evt) {
                img.src = evt.target.result;
            };
            reader.readAsDataURL(file.files[0]);
        }
        console.log(file.files , file.files[0]);
    }

上传图片预览如下:


预览图片

之后,再做图片调整:

//    图片调整
    function changeImg(){
        const img = document.getElementById("img");
        let grayscale = document.getElementById("grayscale").value,
            brightness = document.getElementById("brightness").value,
            contrast = document.getElementById("contrast").value,
            saturate = document.getElementById("saturate").value;
        img.style.webkitFilter = "grayscale("+grayscale+"%) brightness("+brightness+"%) contrast("+contrast+"%) saturate("+saturate+"%)";
        img.style.filter = "grayscale("+grayscale+"%) brightness("+brightness+"%) contrast("+contrast+"%) saturate("+saturate+"%)";
    }
//    数值调整
    function changeValue(type){
        let valBlock,val;
        if(type === 1){
            valBlock =  document.getElementById("grayscaleText");
            val = document.getElementById("grayscale").value;
        }else if(type === 2){
            valBlock =  document.getElementById("brightnessText");
            val = document.getElementById("brightness").value;
        }else if(type === 3){
            valBlock =  document.getElementById("contrastText");
            val = document.getElementById("contrast").value;
        }else if(type === 4){
            valBlock =  document.getElementById("saturateText");
            val = document.getElementById("saturate").value;
        }
        valBlock.innerHTML = val + '%';
        changeImg();
    }
调整滤镜之后的图片

想保存调整好之后的图片,就需要用canvas的toDataURL生成一张新的图片用作下载保存,格式是base64,并且将这个新生成的图片的url存在一个a标签上。

//    下载图片
    function download(url, fullName){
        const a_url = document.createElement('a');
        a_url.href = url;
        a_url.setAttribute('download', fullName);
        a_url.click();
    }
//    保存图片滤镜
    function copyImg(imgNode, format = 'png', quality = 0.97){
        const canvas = document.createElement('canvas');
        canvas.width = imgNode.width;
        canvas.height = imgNode.height;
        const context = canvas.getContext('2d');
        context.filter = getComputedStyle(imgNode).filter;

        imgNode.setAttribute('crossOrigin', 'anonymous');

        context.drawImage(imgNode, 0, 0, canvas.width, canvas.height);
        const url = canvas.toDataURL(`image/${format}`, quality);

        return {
            url,
            then: (cb) => {
                cb(url)
            },
            download: (name = '修改后的图片') => {
                download(url, `${name}.${format}`)
            }
        }
    }

    const img = document.getElementById('img');

//    点击保存
    function downloadImg(){
        copyImg(img).download();
        copyImg(img).then((url) => {
            console.log(url);
        });
    }

如此就将修改后的图片保存下来了


图片对比

以上です。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容