使用Palette抽取Bitmap主色调

关于Palette

一些Support库随着Android Lollipop的发布而诞生了,其中就有Palette。这个库可以让你很轻松地从一幅图中抽取特征颜色,这在你希望界面的颜色风格适应指定图片时非常有用,它还会提供与指定颜色相搭配的字体颜色。

Palette顾名思义调色板, Palette的作用是可以从图像中提取图片的颜色。我们可以把提取的颜色融入到App UI中,可以使UI风格更加美观融洽。有些时候Palette显得非常好用,比如我们可以提取到的突出的色值设置为Toolbar,标题,状态栏的颜色等,可以使我们的整个界面色调统一,效果非常好看。

开始使用

导包

你需要在工程下的build.gradle里添加依赖才可以使用Palette,像如下代码所示:

dependencies {

compile 'com.android.support:palette-v7:21.0.0'

}

生成Palette

生成一幅图像的Palette有一下几种方法:

// Synchronous methods.同步方法--------------------------------

// 这些应该在访问底层图像加载线程时使用。

// 方法1:使用默认16种颜色种类的调色板大小。

Palette p = Palette.generate(bitmap);

// 方法2:允许指定调色板的颜色种类的值,这里为24.

Palette p = Palette.generate(bitmap, 24);

// Asynchronous methods.异步方法--------------------------------

// 这是快速的集成路径,在内部使用AsyncTask等,不一定是最好的方式。

// 方法3:

Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {

@Override

public void onGenerated(Palette palette) {

// Here's your generated palette 这是你生成的调色板

}

});

// 方法4:

Palette.generateAsync(bitmap, 24, new Palette.PaletteAsyncListener() {

@Override

public void onGenerated(Palette palette) {

// Here's your generated palette

}

});

同步方法。由于他们很可能会比较耗时(在分析大图片或者所需颜色较多时),所以它们不应该在主线程中执行。你应该先在别的线程中使用这两个函数进行解析,解析成功之后再使用。

异步方法。有时候你不会在加载图片的线程(非主线程)中使用解析出的颜色,所以Palette提供了异步方法,他们与之前的函数的区别就是需要传入PaletteAsyncListener,提供在图片解析完成后的回调函数。

PaletteAsyncListener的实现是非常简单的(参考下面这几行代码),它只要重写onGenerated就好了。如此一来你就可以在任何需要的时候使用这两个函数创建Palette。

Palette.PaletteAsyncListener listener = new Palette.PaletteAsyncListener() {

public void onGenerated(Palette palette) {

// 使用Palette对象,获取解析出的颜色

}

}

提取出的颜色

Palette默认会解析出图像的16种特征颜色种类,但是这六种颜色是你最经常用到的:

vibrant(鲜艳色)

dark vibrant(鲜艳色中的暗色)

light vibrant(鲜艳色中的亮色)

muted(柔和色)

dark muted(柔和色中的暗色)

light muted(柔和色中的亮色)

借一张别人的图,给大家一种更直观的感受。

Palette解析六个主颜色

获取提取的颜色

你获取Palette对象之后,可以通过以下这些内置getter函数直接获取这六个颜色。你需要传入默认颜色防止Palette无法解析到指定颜色种类,返回的类型是24位RGB颜色数值。

Palette palette = Palette.generate(myBitmap);

int vibrant = palette.getVibrantColor(0x000000);

int vibrantLight = palette.getLightVibrantColor(0x000000);

int vibrantDark = palette.getDarkVibrantColor(0x000000);

int muted = palette.getMutedColor(0x000000);

int mutedLight = palette.getLightMutedColor(0x000000);

int mutedDark = palette.getDarkMutedColor(0x000000);

//独特的一种

getDominantColor(int defaultColor)

//返回从调色板中占主导地位的样本的颜色,为RGB包装INT。

获取Swatch

你也可以选择先获取Swatch对象,然后再通过Swatch提供的方法获取颜色的相关信息:

Palette.Swatch s = p.getVibrantSwatch(); //获取到充满活力的这种色调

Palette.Swatch s = p.getDarkVibrantSwatch(); //获取充满活力的黑

Palette.Swatch s = p.getLightVibrantSwatch(); //获取充满活力的亮

Palette.Swatch s = p.getMutedSwatch(); //获取柔和的色调

Palette.Swatch s = p.getDarkMutedSwatch(); //获取柔和的黑

Palette.Swatch s = p.getLightMutedSwatch(); //获取柔和的亮

//独特的一种

getDominantSwatch()

//返回从调色板中占主导地位的样本。

注意:getVibrantSwatch()可能会返回一个null值,所以在使用前检查一下是必须的。if (swatch != null) {}

Palette解析出的颜色都来自于对应的Swatch,在Swatch里面含有很多关于对应颜色的有用信息。你可以从Swatch中获取RGB颜色值、HSL颜色向量、对应颜色在图像中所占的比例、与对应颜色搭配的标题字体颜色和正文字体颜色(这两个颜色和对应颜色的对比值是处理好的,你不必再去操心)。

swatch对象对应的颜色方法:

getPopulation(): 像素的数量

getRgb(): RGB颜色

getHsl(): HSL颜色

getBodyTextColor(): 用于内容正文文本的颜色

getTitleTextColor(): 标题文本的颜色

Palette只为六种主颜色种类Swatch提供了getter,如果你要使用其他颜色种类的Swatch(一共有16种颜色种类),你需要手动获取它。调用getSwatchs()会返回一个列表,里面有所有获取到的Swatch。

List swatches = palette.getSwatches();

这里是一个Palette获取所有Swatch的例子,里面展示了它们分别在图像中所占的比例:

默认16个颜色值

关于颜色种类的值size

在上面生成Palette的时候,你可能注意到了可以设置Palette的size。size越大,花费的时间越长,而越小,可以选择的色彩也越小。最佳的选择是根据image的用途:

头像之类的,size最好在24-32之间;

风景大图之类的,size差不多在8-16;

默认是16.

Palette实例

Palette经常用于和ViewPager,Fragment搭配使用,当我们的Pager切换时伴随着Fragment的变化,而Fragment里的内容一般是不同的,所以每个Fragment里的一般视觉效果也是不同的,所以我们可以用Palette来去提取Fragment中的主色调,把这个主色调用于整体的UI风格。

效果图

另外一个例子:

这篇博客也大多借鉴上面两篇博客的内容。

Palette的异步方法使得它非常容易去使用,而且我也看到了它用在很多地方。它真是一个非常棒的工具,能够收集一幅图中所有的颜色,并将它们总结到几个不同种类的颜色中。建议大家阅读源码来更多地学习它!

关于更多Palette的详细用法,可以查看官方API文档。

android 4.4 获取图片主色调,Android Lollipop:使用Palette抽取图片主色调相关推荐

  1. Android 通过串口获取设备号 android串口测试工具 完整解析

    前言 android 工业平板RK3399-all 调试有关串口的设备 如何获取对应的串口设备及串口名字 先来一张图说明 获取串口 SerialPortFinder mSerialPortFinder ...

  2. android 定时刷新获取天气信息,android中获取即时天气

    先看效果: 需求非常简单,在菜单中加入天气查询的按钮,点击后显示即时天气. 准备工作: 1.下载华为能力SDK:http://imax.vmall.com/nj-campus/universityEp ...

  3. android自定义view获取控件,android 自定义控件View在Activity中使用findByViewId得到结果为null...

    转载:http://blog.csdn.net/xiabing082/article/details/48781489 1.  大家常常自定义view,,然后在xml 中添加该view 组件..如果在 ...

  4. android子view获取父布局,Android获取布局父ID(Android get layout parent id)

    Android获取布局父ID(Android get layout parent id) 我想知道View和ViewParent有什么区别? 我想获取ImageView父级的Id,但我不能这样做: m ...

  5. android requestmtu,android - 如何设置/获取/请求从Android到iOS或反之亦然BLE的MTU? - 堆栈内存溢出...

    我们正在将MTU请求从Android发送到iOS Android-从此函数onServicesDiscovered回调请求MTU 但是我不知道如何确定对等设备支持是否请求了MTU,以及如何实际协商的M ...

  6. android 6.0获取手机imei,android获取手机信息大全,android获取大全,IMEI号,IESI号,...

    android获取手机信息大全,android获取大全,IMEI号,IESI号, IMEI号,IESI号,手机型号: [java] view plaincopyprint?private void g ...

  7. android 从新浪微博获取用户信息,Android授权登录新浪微博获取用户个人信息

    Android授权登录新浪微博获取用户个人信息 Android授权登录新浪微博获取用户个 人信息 一.准备工作 我们都知道,无论是分享到新浪微博,还是获取新浪微博的用户信息,都离不开一样东西,那就是新 ...

  8. Android IPC 之获取服务(IBinder)

    前言 IPC 系列文章: 建议按顺序阅读. Android IPC 之Service 还可以这么理解 Android IPC 之Binder基础 Android IPC 之Binder应用 Andro ...

  9. android 4.4 获取图片主色调,Android 使用 Palette 获取图片主色调

    Palette是Android中的调色板,我们可以通过传递一个Bitmap来获取一个颜色列表,可以通过类中封装的分析算法来获取其中的 Vibrant(充满活力的) Vibrant dark(充满活力的 ...

最新文章

  1. 基于2-channel network的图片相似度判别
  2. Python3.6 和 Pycharm 详细安装教程
  3. 树回归源码分析(1)
  4. TableView详解
  5. 用随机数发生器射击自己的脚
  6. ABAP WRITE
  7. composer安装
  8. 正则表达式的几种字符判断(包括数字,字母组合等)
  9. 互联网+(怎样保证小孩的安全) 2
  10. 【第三方授权登录】微信授权登录
  11. cad快速看图能合并图纸吗_【CAD快速看图电脑版】合并图纸、2张图之间复制
  12. C++控制台游戏-小镇物语正式版 V1.7.21BUG修复版【可存档!!!】
  13. 软件下载页面php,PHP网页制作软件下载
  14. [转]Xmanager连接Linux远程桌面(后面添加了自己的部分)
  15. php 解析mpp 格式文件
  16. Java基础:宾馆管理系统(一)
  17. redis中键值出现 \xAC\xED\x00\x05t\x00\x11的原因和解决方法
  18. Mac虚拟机安装Windows server 2003 及安装组件提示插入软盘、Outlook提示无法连接pop3服务器
  19. 【PMP】挣值管理(PV、EV、AC、SPI、CPI、BAC、EAC、ETC、TCPI)
  20. 拼多多店铺排名想名列前茅?6招帮你搞定!

热门文章

  1. 执行sudo apt-get update时,不再含有release文件问题解决
  2. 这猪蹄是人类能吃完的?
  3. 如何在Linux上使用快照包
  4. 用计算机对视频进行剪裁和编辑,爱剪辑怎么裁剪视频片段?
  5. 公众号对接淘宝联盟_公众访问新联盟支持的作品
  6. cad线加粗怎么设置_CAD图纸线条粗细如何修改?CAD图纸线宽如何调整?
  7. 要让读者在不看任何数学公式的情况下理解傅里叶分析。
  8. 江西赣州计算机应用中心,赣州计算机应用与维修专业学校
  9. 手机访问电脑文件_你还在苦恼电脑和手机文件如何快速传输吗?
  10. 【软件下载】Excel下载 word下载 官方 官网下载 原始镜像 开发工具 开发软件下载