如何提取图片的主题色?

本篇文章给大家带来的内容是关于如何提取图片的主题色?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

工作时遇到一个需求:提取图片主题色,通过某种映射关系,选取ui给出的对应颜色。脑海中浮现如果只是纯前端如何实现呢?

一、思路与准备

利用canvas获取图像像素信息,然后用某种算法将主题颜色提取出来。

1.1 了解Canvas画布真实像素原理

MDN: 事实上,你可以直接通过getImageData,返回一个imageData对象,获取场景像素数据。

imageData对象包含下列几个只读属性:

width:图片宽度,单位是像素

height:图片高度,单位是像素

data:Uint8ClampedArray类型的一维数组,包含着RGBA格式的整型数据,范围在0至255之间(包括255)。

data属性返回一个 Uint8ClampedArray,它可以被使用作为查看初始像素数据。每个像素用4个 1 bytes值(按照红,绿,蓝和透明值的顺序,”RGBA”格式) 来代表。每个颜色值部份用0至255来代表。每个部分被分配到一个在数组内连续的索引,左上角像素的红色部分在数组的索引0位置。像素从左到右被处理,然后往下,遍历整个数组。
Uint8ClampedArray  包含高度 × 宽度 × 4 bytes数据,索引值从0到(高度×宽度×4)-1

1.2 了解中位切分法 (Median cut)

中位切分法通常是在图像处理中降低图像位元深度的算法,可用来将高位的图转换位低位的图,如将24bit的图转换为8bit的图。我们也可以用来提取图片的主题色,其原理是是将图像每个像素颜色看作是以R、G、B为坐标轴的一个三维空间中的点,由于三个颜色的取值范围为0~255,所以图像中的颜色都分布在这个颜色立方体内。如图所示:

2908790571-5bc8652ad58f7_articlex.png

之后将RGB中最长的一边从颜色统计的中位数一切为二,使得到的两个长方体所包含的像素数量相同,如下图所示重复这个过程直到切出长方体数量等于主题色数量为止,最后取每个长方体的中点即可。

1599935469-5bc8652ae2fb7_articlex.png

在实际使用中如果只是按照中点进行切割,会出现有些长方体的体积很大但是像素数量很少的情况。解决的办法是在切割前对长方体进行优先级排序,排序的系数为体积 * 像素数。这样就可以基本解决此类问题了。

其中color-thief库就是基于中位切分法实现的。

以上就是如何提取图片的主题色?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2908733.html

(0)
上一篇 2025年3月11日 03:13:25
下一篇 2025年2月27日 10:53:20

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • HTML5和原生app如何进行交互?

    本篇文章给大家带来的内容是关于html5和原生app如何进行交互?有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 h5与原生 app 交互的原理 现在移动端 web 应用,很多时候都需要与原生 app 进行交互、沟通(运行在…

    2025年3月11日
    200
  • 如何在网站头部添加视频海报?添加视频海报的方法(代码示例)

    本篇文章给大家带来的内容是介绍如何在网站头部添加视频海报?添加视频海报的方法(代码示例) 。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 给网站头部添加视频海报的代码: nbsp;html>        视频海报…

    2025年3月11日
    200
  • HTML5中一些可以优化的细节介绍

    本篇文章给大家带来的内容是关于html5中一些可以优化的细节介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 介绍一些最近整理的优化细节。图片压缩什么的就不说了,这是优化必须做的。今天就说一下大家写代码时可以培养的优化的…

    编程技术 2025年3月11日
    200
  • 如何用HTML5在页面中插入可自动播放的视频

    大家在浏览网站时有没有注意到网站上有视频,音频等,正在学习html和css的小伙伴,你知道如何用html5在页面中插入视频并自动播放吗?这篇文章就和大家讲讲html5如何插入视频以及html插入视频的代码,感兴趣的小伙伴可以参考一下。 HT…

    2025年3月11日
    200
  • html5如何插入可自动播放的音频(图文)

    经常浏览网站或者经常进行页面布局的人,应该对页面中的音频,视频不陌生吧,正在学习html5的小伙伴,你知道html5中怎么插入音频并自动播放吗?这篇文章就和大家一起研究html5中的音频标签以及html5插入音频的代码,有一定的参考价值,可…

    2025年3月11日
    200
  • html5如何实现简单进度条效果?动态进度条的实现(代码示例)

    在浏览网站时经常会遇到页面的加载,此时页面会出现一个动态的进度条,不断滚动加载着,直到加载完成。那么这样一个动态进度条是如何实现的?这篇文章就给大家介绍html5实现简单动态进度条效果的方法,并将页面动态进度条滚动加载的代码分享给大家,感兴…

    2025年3月11日
    200
  • html5实现表单的复选框验证

    本篇文章给大家介绍html5实现表单的复选框验证,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 在之前的文章【JavaScript如何实现表单的复选框验证】中介绍了使用js实现表单的复选框验证的方法,本篇就在给大家介绍一…

    2025年3月11日
    200
  • 字符编码是什么?html5如何设置字符编码?

    本篇文章给大家带来的内容是介绍字符编码是什么,html5如何设置字符编码;让大家了解字符编码的作用,用html5设置字符编码的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 首先我们来了解字符编码是什么?有什么用? …

    编程技术 2025年3月11日
    200
  • 用canvas实现简单的下雪效果(附代码)

    本篇文章给大家带来的内容是关于用canvas实现简单的下雪效果(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 首先新建一个html文件,将body的背景设置为天空的那种深蓝色,并创建一个canvas,canvas…

    2025年3月11日
    200
  • input实现文字超出省略号(代码示例)

    本篇文章给大家带来的内容是关于input实现文字超出省略号(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 input实现文字省略号功能 普通元素实现文字超出宽度自动变成省略号非常简单,给元素加个宽度,然后再加这…

    2025年3月11日
    200

发表回复

登录后才能评论