91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript如何實現簡單獲取本地圖片主色調

發布時間:2023-03-07 14:10:58 來源:億速云 閱讀:239 作者:iii 欄目:開發技術

本篇內容介紹了“JavaScript如何實現簡單獲取本地圖片主色調”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    實現

    1、實現思路

    其實思路很簡單,就是將一張大圖先縮小為一張小圖,再遍歷里面的像素,找到出現次數相對較高的一個;當然,先說明一下,這個也只能實現一個提取近似的值或者跟“人的意識”相反的值,因此,最終結果的“滿意程度”可能不是很好。

    2、實現代碼

    創建一個 ThemeColor 操作對象,通過回調返回縮略圖主色調 ,可進行相關的其他操作

    //本地圖片資源
    let url = 'tree.webp'
    document.getElementById('originalImage').src = url
    let themeColor = new ThemeColor(url,(shrinkUrl,color)=>{
        //縮略圖
        let img = document.getElementById('showImage')
        if(img){
            img.setAttribute('src',shrinkUrl)
        }
        //主色
        document.getElementById('showDiv').style.backgroundColor = color
    })

    ThemeColor.js

    class ThemeColor{
        // 原圖資源
        imgUrl = ''
        // 像素集合
        originalPiexls = null
        // 縮略圖
        shrinkUrl = ''
        // 主色
        themeColor = 'white'
        // 回調
        themeColorCallBack = null
        // 提取像素出現最大次數操作對象
        colorCountedSet = new ColorCountedSet()
        
        constructor(imgUrl,callBack){
            this.imgUrl = imgUrl
            this.themeColorCallBack = callBack
            this.startScreeningThemeColor()
        }
        
        // 開始解析主色
        async startScreeningThemeColor(){
            try {
                await this.shrinkImage()
            } catch (error) {
                console.log('error:' + error)
            }
            this.screeningThemeColor()
        }
    
        // 圖片縮小
        async shrinkImage(){
            var image = new Image();
            image.src = this.imgUrl;
            await new Promise((resolve)=>{
                image.onload = resolve
            })
            let width = image.width
            let height = image.height
            let shrinkFactor = 10
            let shrinkWidth = width / shrinkFactor
            let shrinkHeight = height / shrinkFactor
            let canvas = document.createElement('canvas')
            canvas.setAttribute('width',`${shrinkWidth}px`)
            canvas.setAttribute('height',`${shrinkHeight}px`)
            var ctx = canvas.getContext("2d")
            ctx.drawImage(image,0,0,shrinkWidth,shrinkHeight)
            this.shrinkUrl = canvas.toDataURL('image/jpeg',1)
            try {
                //保存像素
                this.originalPiexls = ctx.getImageData(0,0,width,height)
            } catch (error) {
                console.log(error)
            }
        }
    
        // 開始篩選主題色
        screeningThemeColor(){
            if(!this.originalPiexls || !this.originalPiexls.data || this.originalPiexls.data.length == 0){
                throw('像素為空')
            }
            for(let i = 0;i < this.originalPiexls.data.length;i+=4){
                let r = this.originalPiexls.data[i]
                let g = this.originalPiexls.data[i + 1]
                let b = this.originalPiexls.data[i + 2]
                let a = this.originalPiexls.data[i + 3] / 255.0
                //添加一個色值范圍,讓它能忽略一定無效的像素值
                if(a > 0 && (r < 200 && g < 200 && b < 200) && (r > 50 && g > 50 && b > 50)){
                    this.colorCountedSet.push(r,g,b,a)
                }
            }
    
            let maxCount = 0
            // 尋找出現次數最多的像素定為主色調
            this.colorCountedSet.forEach((value,key)=>{
                if(maxCount <= value){
                    maxCount = value
                    this.themeColor = 'rgba(' + key + ')'
                }
            })
            //執行回調
            if(this.themeColorCallBack){
                this.themeColorCallBack(this.shrinkUrl,this.themeColor)
            }
        }
     }
    
    // 統計不同像素的出現次數
    class ColorCountedSet{
        //像素集合
        map = new Map()
        
        //添加像素到集合
        push(r,g,b,a){
            //根據像素值生成一個map 元素 key值
            let identification = r + ',' + g + ',' + b + ',' + a
            if(!this.map.get(identification)){
                this.map.set(identification,1)
            } else {
                // 存在進行次數自增
                let times = parseInt(this.map.get(identification)) + 1
                this.map.set(identification,times)
            }
        }
    
    // 給 ColorCountedSet 操作類添加一個 forEach 方法 
    forEach(cb){
            this.map.forEach(function(value,key){
                    cb(value,key)
            });
        }
    }

    “JavaScript如何實現簡單獲取本地圖片主色調”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    恭城| 嘉峪关市| 孝义市| 沾益县| 瓮安县| 海晏县| 茂名市| 肥西县| 灵武市| 桐乡市| 棋牌| 新蔡县| 马关县| 汤原县| 屏山县| 平和县| 荔浦县| 安顺市| 中卫市| 金秀| 东城区| 承德县| 临安市| 南昌县| 海兴县| 大庆市| 顺平县| 壶关县| 历史| 曲水县| 通山县| 苍南县| 彭阳县| 大邑县| 杨浦区| 堆龙德庆县| 济源市| 尼木县| 鄂托克前旗| 乐至县| 北宁市|