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

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


在android L之后就可以在导入android support v7 palette jar 包就可以使用Palette来获取图片中的颜色.
由于需要在锁屏页面根据锁屏壁纸的颜色来适配相关图标的颜色和字体颜色,所以就了解了一下Palette的使用,当然不是要 Palette也是可以实现这个需求的.后面也会记录一下使用其他方法实现这个需求.

1.Palette的创建和使用

   
   
  1. Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
  2. @Override
  3. public void onGenerated(Palette palette) {
  4. Palette.Swatch swatch = palette.getMutedSwatch();
  5. //Palette.Swatch swatch = palette.getVibrantSwatch();
  6. //Palette.Swatch swatch = palette.getDarkMutedSwatch();
  7. //Palette.Swatch swatch = palette.getDarkVibrantSwatch();
  8. //Palette.Swatch swatch = palette.getLightMutedSwatch();
  9. //Palette.Swatch swatch = palette.getLightVibrantSwatch();
  10. if (swatch != null) {
  11. view.setBackgroundColor(swatch.getRgb());
  12. } else {
  13. }
  14. }
  15. });
  16. }
上面是一种基本的使用方法,而且是使用的异步方法.其实还有其他方法来创建Palette
两种同步方法:
    
    
  1. // 最好在加载图片线程中使用
  2. // 默认调色板大小(16).
  3. Palette p = Palette.generate(bitmap);
  4. //设置调色板大小(24)
  5. Palette p = Palette.generate(bitmap, 24);

两种异步方法:
    
    
  1. // 简单快速的实现方法,内部使用AsyncTask
  2. // 但是可能不是最优的方法(因为有线程的切换)
  3. // 默认调色板大小(16).
  4. Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
  5. @Override
  6. public void onGenerated(Palette palette) {
  7. // palette为生成的调色板
  8. }
  9. });
  10. // 设置调色板大小(24)
  11. Palette.generateAsync(bitmap, 24, new Palette.PaletteAsyncListener() {
  12. @Override
  13. public void onGenerated(Palette palette) {
  14. // palette为生成的调色板
  15. }
  16. });

以上在早期(android L出来时)可以使用的方法,但是在android M出来时又更新了android support v7 包,也可以使用Palette.Builder().
    
    
  1. //首先获取一个Palette.Builder(稍后用到)
  2. Palette.Builder b = new Palette.Builder(bitmap);
  3. //设置好我们需要获取到多少种颜色
  4. b.maximumColorCount(1);
  5. //异步的进行颜色分析
  6. b.generate(new Palette.PaletteAsyncListener() {
  7. @Override
  8. public void onGenerated(Palette palette) {
  9. //获取颜色列表的第一个
  10. Palette.Swatch swatch = palette.getSwatches().get(0);
  11. if (swatch != null) {
  12. view.setBackgroundColor(swatch.getRgb());
  13. } else {
  14. }
  15. }
  16. });

2.可以使用Paltette来那些颜色

生成了Palette对象后就可以尝试获取六种不同的色板,具体如下:
    
    
  1. Palette.Swatch s1 = Palette.getVibrantSwatch(); //充满活力的色板
  2. Palette.Swatch s2 = Palette.getDarkVibrantSwatch(); //充满活力的暗色类型色板
  3. Palette.Swatch s3 = Palette.getLightVibrantSwatch(); //充满活力的亮色类型色板
  4. Palette.Swatch s4 = Palette.getMutedSwatch(); //黯淡的色板
  5. Palette.Swatch s5 = Palette.getDarkMutedSwatch(); //黯淡的暗色类型色板
  6. Palette.Swatch s6 = Palette.getLightMutedSwatch(); //黯淡的亮色类型色板
获取到色板(Swatch)对象之后就可以使用它来获取各种颜色
 getPopulation(): the number of pixels represented by this swatch
getRgb(): the RGB value of this color.
getHsl(): the HSL value of this color.
getBodyTextColor(): the RGB value of a text color which can be displayed on top of this color.
getTitleTextColor(): the RGB value of a text color which can be displayed on top of this color.

3.实际需求应用

在前面说到的需求用上面的相关的api实际开发的时候会发现效果不理想.因为如果一张壁纸颜色比较花的时候也就是颜色类似很多的时候会出现使用Swatch 获取相关的颜色效果不理想.
我们为了获取的颜色值更理想,所以我们就只获取一个Swatch 色板对象,因为默认是获取16个,这16个颜色获取的顺序是根据颜色占的比例多少和亮暗来排序.
我们自己可以设置这个数量,但这个实际能获取到的数量也会和图片中颜色种类有关.

我们如果只获取一种Swatch 色板,获取到的颜色就肯定是很渐进我们想要值.
方法1:(android L发布的support v7 包支持)
     
     
  1. setContentView(R.layout.palette_layout);
  2. final View root_ll = this.findViewById(R.id.root_ll);
  3. final TextView main_color = (TextView) this.findViewById(R.id.main_color);
  4. WallpaperManager wallpaperManager = (WallpaperManager) this.getSystemService(Context.WALLPAPER_SERVICE);
  5. Drawable wallpapaer = wallpaperManager.getDrawable();
  6. Bitmap bitmap = ((BitmapDrawable) wallpapaer).getBitmap();
  7. Palette.generateAsync(bitmap, 1, new Palette.PaletteAsyncListener() {
  8. @Override
  9. public void onGenerated(Palette palette) {
  10. // palette为生成的调色板
  11. //获取颜色列表的第一个
  12. Palette.Swatch swatch = palette.getSwatches().get(0);
  13. main_color.setText("" +"壁纸的主要颜色=" + Integer.toHexString(swatch.getRgb()) + "\n合适的字体颜色=" +Integer.toHexString(swatch.getTitleTextColor()));
  14. main_color.setTextColor(swatch.getTitleTextColor());
  15. root_ll.setBackgroundColor(swatch.getRgb());
  16. }
  17. });

方法2:(android M发布的support v7 包支持)
     
     
  1. Palette.Builder b = new Palette.Builder(bitmap);
  2. //设置好我们需要获取到多少种颜色
  3. b.maximumColorCount(1);
  4. //异步的进行颜色分析
  5. b.generate(new Palette.PaletteAsyncListener() {
  6. @Override
  7. public void onGenerated(Palette palette) {
  8. }
  9. });

获取了壁纸中的主要颜色和合适在这个颜色上面显示的字体颜色之后我们只要判断这个颜色是渐进白色还是接近黑色就可以使用ImageView.setColorFilter(int color)来滤掉锁屏上面相关Imageview控件颜色.字体就直接重新设置一下字体的颜色就可以了.当然我们还要监听壁纸的改变.
关于颜色过滤这个部分之前在SystemUI 模块部分也有记录,可以直接参考.










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值