使用 Palette 支持包分析图片的像素数据,并为旨在补充此图片的背景和文本产生颜色样本。

调色板仅作为 Android 支持库中的模块提供,它不是核心框架的一部分。然而,目标平台为 API Level 7或之后版本的任意应用程序都可以通过包含支持库使用调色板。可以把 V7 支持库中的关于 palette 的 jar 包拷贝到应用程序中的 libs 包下。

效果如下:

item_list.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/root"android:padding="16dp"><ImageViewandroid:id="@+id/image"android:scaleType="centerCrop"android:layout_width="match_parent"android:layout_height="102dp" /><TextViewandroid:id="@+id/text"android:gravity="center"android:textAppearance="?android:textAppearanceLarge"android:layout_width="match_parent"android:layout_height="72dp" /></LinearLayout>

ColorfulAdapter.java :

package com.crazy.colorfilters;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.AsyncTask;
import android.support.v7.graphics.Palette;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;/*** Created by antimage on 2015/12/27.*/
public class ColorfulAdapter extends ArrayAdapter<String> {private static final int[] IMAGES = {R.drawable .bricks, R.drawable.flower, R.drawable.grass,R.drawable.stones, R.drawable.wood, R.drawable.dog};private static final String[] NAMES = {"砖", "花", "草", "石", "木", "狗"};private SparseArray<Bitmap> mImages;private SparseArray<Palette.Swatch> mBackgroundColors;public ColorfulAdapter(Context context) {super(context, R.layout.item_list, NAMES);mImages = new SparseArray<>(IMAGES.length);mBackgroundColors = new SparseArray<>(IMAGES.length);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_list, parent, false);}View root = convertView.findViewById(R.id.root);ImageView image = (ImageView)convertView.findViewById(R.id.image);TextView text = (TextView)convertView.findViewById(R.id.text);int imageId = IMAGES[position];if (mImages.get(imageId) == null) {new ImageTask().execute(imageId);text.setTextColor(Color.BLACK);} else {image.setImageBitmap(mImages.get(imageId));Palette.Swatch colors = mBackgroundColors.get(imageId);if (colors != null) {root.setBackgroundColor(colors.getRgb());text.setTextColor(colors.getTitleTextColor());}}text.setText(NAMES[position]);return convertView;}private class ImageResult {public int imageId;public Bitmap image;public Palette.Swatch colors;public ImageResult(int imageId, Bitmap image, Palette.Swatch colors) {this.imageId = imageId;this.image = image;this.colors = colors;}}private void updateImageItem(ImageResult result) {mImages.put(result.imageId, result.image);mBackgroundColors.put(result.imageId, result.colors);}private class ImageTask extends AsyncTask<Integer, Void, ImageResult> {@Overrideprotected ImageResult doInBackground(Integer... params) {int imageId = params[0];// 确保图片缩略图不会太大BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 4;Bitmap image = BitmapFactory.decodeResource(getContext().getResources(), imageId, options);Palette colors = Palette.generate(image);Palette.Swatch selected = colors.getVibrantSwatch();if (selected == null) {selected = colors.getMutedSwatch();}return new ImageResult(imageId, image, selected);}@Overrideprotected void onPostExecute(ImageResult result) {updateImageItem(result);notifyDataSetChanged();}}
}

在适配器的 getView() 回调中,可以看到文本颜色和背景容器颜色都从 Palette.Swatch 中读取,Palette.Swatch 可能已经存在,也可能还不存在。

因为从磁盘加载图片和使用 Palette 分析这些图片的过程会花费一些时间,所以我们要在后台执行此工作以避免阻塞主线程太长时间,所以将工作封装在 AsyncTask 中。

后台加载的结果存储在一对 SparseArray 实例中。当适配器在没有产生结果的情况下遇到一个图片条目时,它会触发新的后台任务以加载内容。通过 BitmapFactory 解码图片之后,可以使用 Palette.Generate() 收集颜色方案数据,该方法将在分析图片时阻塞。

如果在生成颜色方案时未准备好后台线程, Palette 的 generateAsync() 方法会接受回调。

完成上述操作后,可以使用各种 getter 方法访问颜色样本。首先尝试使用 getVibrantSwatch() 获取 Vibrant 样本。如果图片颜色不兼容 Vibrant 颜色方案(即返回 null),我们就降低要求,获取一种颜色减弱的样本。

解码的图片和选择的样本封装在持有者对象(ImageResult)中,这样有助于从 AsyncTask 返回多个条目,AsyncTask 仅支持返回单个类型。

ColorfulListActivity.java :

package com.crazy.colorfilters;import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.GridView;public class ColorfulListActivity extends ActionBarActivity {private GridView mGridView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mGridView = new GridView(this);mGridView.setNumColumns(2);mGridView.setAdapter(new ColorfulAdapter(this));setContentView(mGridView);}
}

使用 Palette 提取图片调色板相关推荐

  1. Android Palette 提取图片的主色调

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/smil ...

  2. android取图片颜色代码,Android Palette 提取图片的主色调

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此 博主:威威喵 | 博客主页:https://blog.csdn.net/smil ...

  3. 使用Palette类提取图片的颜色信息

    原文出处:http://qichaochen.github.io/2014/11/16/105-Android-5.0-Palette-01/ 在Material Design设计中很重要的一部分内容 ...

  4. android 4.4 获取图片主色调,Android Lollipop:使用Palette抽取图片主色调

    使用Palette抽取Bitmap主色调 关于Palette 一些Support库随着Android Lollipop的发布而诞生了,其中就有Palette.这个库可以让你很轻松地从一幅图中抽取特征颜 ...

  5. Android Jetpack: 利用 Palette 进行图片取色 | 开发者说·DTalk

    本文原作者: BennuC,原文发布于: BennuCTech Palette 即调色板这个功能其实很早就发布了,Jetpack 同样将这个功能也纳入其中,想要使用这个功能,需要先依赖库. imple ...

  6. 基于QT和Node.js的八叉树算法提取图片主题色

    资源下载地址:https://download.csdn.net/download/sheziqiong/85883609 资源下载地址:https://download.csdn.net/downl ...

  7. Nodejs提取图片主图色(二)

    Nodejs提取图片主图色(一) 如何提高颜色提取的正确率 主要是 images.jpeg-js.pngjs 共用,彼此之间并不冲突 // node-pixels.js 'use strict';va ...

  8. 利用几种颜色量化方法提取图片颜色色调

    利用几种颜色量化方法提取图片颜色色调 利用几种颜色量化方法提取图片颜色色调 1 k-means方法(在RGB空间) 2 k-means方法(Lab颜色空间) 3 最小方差量化方法rgb2ind() 4 ...

  9. 颜色量化 matlab,利用几种颜色量化方法提取图片颜色色调

    利用几种颜色量化方法提取图片颜色色调 这里主要用3种方法:包含两种k-means方法和一种matlab自带的最小方差量化方法. 为了方便对比,文中选用梵高的星空(The Starry Night)作为 ...

最新文章

  1. 自己动手实现OpenGL之glViewPort(一)
  2. jquery post 返回php,如何在成功的AJAX / jQuery POST上返回PHP变量
  3. springwebflux 页面_Spring Webflux 响应式框架入门
  4. Python:判定IP地址合法性的三种方法
  5. vb与matlab数据交互时间延时多长,VB中实现延时(等待)的几种方法
  6. 编程方法学25:设计实用社交网络
  7. 处理本地能登陆mysql但navicat连接不上的问题
  8. mysql 更新时间加数字_Mysql实战45讲笔记:8、聚合函数count
  9. PhpStorm 配置debug断点调试
  10. 一位 女生在第一次应聘软件开发工作时成功被淘汰的例子
  11. 水题总结NYOJ74,1094,60,975,111,833
  12. PYTHON开发--面向对象基础入门
  13. creat是什么意思中文翻译_英语create的中文是什么意思
  14. webbrowser设置横向打印_9个Excel打印神技巧!从此打印不求人!
  15. Windows 新建文本文档快捷键设置
  16. 7. CPU Scheduling
  17. C++的依赖倒置原则
  18. matlab求含参数一元三次方程,matlab 求解一元三次方程,带其他参数
  19. Eclipse下jsp模板设置
  20. 互联网公司如何管理研发团队

热门文章

  1. 9. JVM-方法区
  2. php 打开word显示无法打开文件,phpword 生成doc文件 特殊符号 无法打开
  3. Nim游戏入门+SG函数
  4. 用74ls90组成二十四进制计数器_一个厉害的芯片芯片74LS190同步计数器可以做加法也可以做减法...
  5. 华为云从入门到实战 | 云容器服务
  6. html时显示当前时间的时钟,javascript实现页面的实时时钟显示示例
  7. 零信任架构在企业中的应用
  8. 前端 - excel导入 / 导出功能
  9. PythonOCC基础使用:基础建模指令(重要)
  10. 地壳中元素含量排名记忆口诀_地壳中元素含量_地壳中元素含量口诀