图片部分区域颜色是否近似实例页面

回到相关文章 »

效果:

//zxx: 点击图片可以切换素材

代码:

CSS代码:
.container img {
    display: block;
    width: 300px; height: 400px;
    user-select: none;
}
.container {
    width: 300px;
    position: relative;
}
.cover {
    position: absolute;
    left: 20px; right: 20px; top: 0;
    height: 100px;
    border: 2px solid yellow;
    cursor: move;
}
HTML代码:
<div class="container">
    <i id="cover" class="cover"></i>
    <img id="img" src="01.jpg">
</div>
<p id="result"></p>
JS代码:
<script src="color-thief.js"></script>
<script src="./image-similarity.js"></script>
<script>
    let getSimilarity = function () {
        // 剪裁范围
        // 注意,需要相对于原始图片尺寸
        // 这里图片1/2缩放显示,因此需要乘以2
        let bounding = [20, parseFloat(getComputedStyle(cover).top) + 2, 300 - 40, 100].map(v => v * 2);

        // 获得此时的范围颜色相似度
        imageSimilarity(img.src, bounding).then(similarity => {
            // 0 极度相似
            // 1 相似
            // 2 不太相似
            // 3 不相似
            // 4 差异较大
            if (similarity === 0) {
                result.innerHTML = '视觉色彩极度相似';
            } else if (similarity === 1) {
                result.innerHTML = '视觉色彩相似';
            } else if (similarity === 2) {
                result.innerHTML = '视觉色彩不太相似';
            } else if (similarity === 3) {
                result.innerHTML = '视觉色彩不相似';
            } else {
                result.innerHTML = '视觉色彩差异较大';
            }
        });
    };

    let store = {};
    cover.addEventListener('mousedown', (event) => {
        store.y = event.pageY;
        store.isMoving = true;
        store.top = parseFloat(getComputedStyle(cover).top) || 0;
    });
    document.addEventListener('mousemove', event => {
        if (store.isMoving) {
            event.preventDefault();

            let distanceY = event.pageY - store.y;
            let top = store.top + distanceY;

            if (top < 0) {
                top = 0;
            } else if (top + cover.offsetHeight > cover.parentElement.clientHeight) {
                top = cover.parentElement.clientHeight - cover.offsetHeight;
            }

            cover.style.top = top + 'px';
        }
    });
    document.addEventListener('mouseup', function () {
        if (store.isMoving) {
            store.isMoving = false;

            getSimilarity();
        }            
    });

    // 默认进来先判断一次相似度
    getSimilarity();

    img.onclick = function () {
        this.src = /01/.test(this.src) ? '02.jpg' : '01.jpg';

        getSimilarity();
    };
</script>