欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Canvas繪制像素風(fēng)圖片的示例代碼

  發(fā)布時(shí)間:2021-09-22 17:06:27   作者:jsmask   我要評(píng)論
像素風(fēng)的游戲是80,90后的童年,像素風(fēng)本身就是由極度簡(jiǎn)單的元素構(gòu)成極度復(fù)雜的畫(huà)面,本文介紹了Canvas繪制像素風(fēng)圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

童年玩紅白機(jī)。尤其國(guó)內(nèi)的小霸王那段時(shí)光還記得么。
那個(gè)馬里奧大叔還記得么。

因?yàn)樘貏e喜歡像素風(fēng)的游戲從小到大一直都是,像素風(fēng)本身就是由極度簡(jiǎn)單的元素構(gòu)成極度復(fù)雜的畫(huà)面,因此它可以具備無(wú)限的創(chuàng)作空間,形成令人過(guò)目不忘的獨(dú)特畫(huà)風(fēng)。所以我想借用一張清晰的圖片生成出具有像素點(diǎn)陣的圖片來(lái)批量制造。
這是我寫(xiě)的第一篇短文,很多不足之處請(qǐng)多包涵。

介紹

怎么讓清晰的圖片轉(zhuǎn)化成像素風(fēng)格的圖片呢?

首先我們要了解到像素風(fēng)是由簡(jiǎn)單的單一色塊來(lái)構(gòu)成的。

所以我們第一就是上傳一張圖片,然后繪制出來(lái)。再解析每隔一定像素給圖片取出色值和位置來(lái)。再將這些色值重新繪制到畫(huà)布相應(yīng)位置中,那么一張像素風(fēng)就是這么簡(jiǎn)單實(shí)現(xiàn)了。

實(shí)現(xiàn)

1. 上傳原圖片

<input type="file" accept=".jpeg,.jpg,.png" />
<script>
document.querySelector("input[type=file]").addEventListener("change",uploadImage, false);
</script>

首先我們先要在頁(yè)面放置一個(gè)上傳文件得input。這些用accept屬性限制他得上傳類(lèi)型,因?yàn)樯婕暗匠R?guī)的一些圖片上傳這里就傳jpeg,jpg,png三種格式了。

與此同時(shí),要監(jiān)聽(tīng)他的改變從而拿到所需要轉(zhuǎn)換的文件。

接下來(lái)我將定義一個(gè)uploadImage函數(shù)。

function uploadImage(e) {
    let file = e.target.files[0];
    if (!file) return;
    let fileReader = new FileReader();
    fileReader.readAsDataURL(file);
    fileReader.onload = () => {
        createImage(fileReader);
        e.target.value = "";
        document.querySelectorAll("canvas").forEach(node=>{node.remove();})
    };
}

function createImage(obj) {
    let img = new Image();
    img.onload = () => {
        drawImage(img);
    };
    img.src = obj.result;
}

這里我們就可以在fileReader.result拿到上傳后的圖片地址了,再寫(xiě)一個(gè)createImage函數(shù)用來(lái)接收文件對(duì)象實(shí)例化成Image方便給畫(huà)布繪制。畢竟一個(gè)函數(shù)盡量只做單一的一件事也算是個(gè)好習(xí)慣吧。

2.繪制原圖片

function drawImage(img) {
        let canvas = document.createElement("canvas");
        let ctx = canvas.getContext("2d");
        canvas.width = ctx.width;
        canvas.height = ctx.heigh
        let w = img.width,
          h = img.height;
        ctx.drawImage(img,0,0,w,h);
        document.body.appendChild(canvas);
 }

我們先實(shí)現(xiàn)把圖片繪制到畫(huà)布上康康,到底啥樣?,F(xiàn)在我們就想了,我們到底要生成多大的像素畫(huà)呢。這里我們想做一個(gè)全局變量吧。

let width = 32;
let height = 32;
let size = 10;

我們定義生成一個(gè)寬度,高度,像素尺寸。寬高故名思議,就是我們要生成多少寬多少個(gè)點(diǎn),高多少個(gè)點(diǎn)的像素。size表示了一個(gè)像素填充多大,也就是每隔size個(gè)像素取一個(gè)色值。
接下來(lái)我們改造一下drawImage函數(shù)。

function drawImage(img) {
    let canvas = document.createElement("canvas");
    let ctx = canvas.getContext("2d");
    canvas.width = ctx.width = width * size;
    canvas.height = ctx.height = height * size;
    let w = img.width,
        h = img.height;
    let v = w / h;
    if (v > 1) {
        w = width;
        h = w / v;
    } else {
        h = height;
        w = h * v;
    }
    ctx.drawImage(
        img,
        ((width - w) / 2) * size,
        ((height - h) / 2) * size,
        w * size,
        h * size
    );
    document.body.appendChild(canvas);
    
    let pxMap = createPxMap(ctx);
    drawPXCanvas(pxMap)
}

我們期望繪制圖片后生成一套個(gè)包含像素信息的數(shù)組返回出來(lái),然后我們?cè)龠M(jìn)行像素風(fēng)的生成。
當(dāng)然我們?yōu)榱藘蓮垐D做對(duì)比,把原圖寬高也和像素圖拉平,并且居中顯示在畫(huà)布中。

3.繪制像素畫(huà)

function createPxMap(ctx){
    let pxMap = [];
    for (let i = 0; i < width * size; i += size) {
        for (let j = 0; j < height * size; j += size) {
            let pixel = ctx.getImageData(i, j, 1, 1).data;
            let color = `rgba(${pixel[0]},${pixel[1]},${pixel[2]},${pixel[3]/255})`;
            pxMap.push({ x: i / size, y: j / size, color });
        }
    }
    return pxMap;
}

我首先要得到點(diǎn)的位置和顏色信息,ctx.getImageData可以獲取到一個(gè)buffer數(shù)組,0-3位分別代表紅,綠,藍(lán),透明度的信息。我們要將這些信息存儲(chǔ)起來(lái)。
到了最后我們終于要可以繪制像素畫(huà)了。

function drawPXCanvas(pxMap) {
    let canvas = document.createElement("canvas");
    let ctx = canvas.getContext("2d");
    canvas.width = ctx.width = width * size;
    canvas.height = ctx.height = height * size;
    pxMap.forEach((px) => {
        const { color, x, y } = px;
        ctx.fillStyle = color;
        ctx.fillRect(x*size, y*size, size, size);
    });
    document.body.appendChild(canvas);
}

我們要重新生成一個(gè)畫(huà)布,將剛剛收集到的像素信息逐個(gè)繪制到畫(huà)布上,這樣一張簡(jiǎn)單的像素畫(huà)就這么完成了,是不是很容易。

拓展

其實(shí)拿到像素信息的時(shí)候,可以不局限于canvas2d像素畫(huà)了。

還有以下思路:

我們可以借助于css的box-shadow來(lái)生成像素畫(huà),用:root 或者scss 更容易控制大小和位置,配合animation生成動(dòng)畫(huà)也未嘗不可。

甚至我們也可以拓展webgl的,生成3d像素,或者其他風(fēng)格也未嘗不可。

3d皮卡丘

我們可以將再深入分析像素化構(gòu)成逐幀生成視頻和動(dòng)畫(huà)。。。

到此這篇關(guān)于Canvas繪制像素風(fēng)圖片的示例代碼的文章就介紹到這了,更多相關(guān)Canvas 像素風(fēng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • Canvas 像素處理之改變透明度的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Canvas 像素處理之改變透明度的實(shí)現(xiàn)代碼的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-08
  • canvas像素畫(huà)板的實(shí)現(xiàn)代碼

    本文實(shí)現(xiàn)一個(gè)類(lèi)似像素風(fēng)格的畫(huà)板,可以像素小格子可以擦除,框選變色,可以擦出各種圖形,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-21
  • canvas像素點(diǎn)操作之視頻綠幕摳圖

    這篇文章主要介紹了canvas像素點(diǎn)操作之視頻綠幕摳圖的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-11
  • 使用Canvas操作像素的方法

    這篇文章主要介紹了使用Canvas操作像素的方法的相關(guān)資料,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-06-14
  • HTML5 Canvas畫(huà)線技巧——實(shí)現(xiàn)繪制一個(gè)像素寬的細(xì)線

    繪制一個(gè)像素寬的細(xì)線,在使用HTML5 Canvas實(shí)現(xiàn)時(shí)要特別注意確保你的所有坐標(biāo)點(diǎn)是整數(shù),否則HTML5會(huì)自動(dòng)實(shí)現(xiàn)邊緣反鋸齒,感興趣的朋友可以看下效果圖
    2013-08-02
  • html5 Canvas畫(huà)圖教程(3)—canvas出現(xiàn)1像素線條模糊不清的原因

    上次我們講到,canvas有時(shí)候會(huì)出現(xiàn)1像素的線條模糊不清且好像更寬的情況,這樣的線條顯然不是我們想要的。這篇文章的目的就是弄清楚里面的原理,以及解決它,感興趣的朋友可
    2013-01-09
  • HTML5 Canvas像素處理使用接口介紹

    本文通過(guò)簡(jiǎn)單的代碼實(shí)例,以及略猥瑣的圖片demo,展示了canvas在圖像像素?cái)?shù)據(jù)操作方面的常用接口,有需求的朋友可以參考下
    2012-12-02

最新評(píng)論