毕加索加载后,如何为我的位图获取调色板?

时间:2015-02-24 19:57:33

标签: android picasso android-palette

2014年10月,杰克沃顿写了Coercing Picasso to Play With Palette。在其中,有两种方法在思考:

  1. 使用转换生成调色板。这样做的好处是,调色板是在Picasso的工作线程上生成的,并且在加载图像时就绪。然而,缺点似乎是我得到了与图片不匹配的调色板。目前我一次只运行其中一个转换。

  2. 使用Callback onSuccessImageView获取位图并生成调色板。我不禁专注于Jake在这一行末尾提出的// Ew!,我完全赞同。

  3. 上面提到的帖子是在2014年10月写的。现在我们已经过了几个月的讨论,我想知道推荐的方法是什么? 还讨论了将meta data与位图相关联的问题。这是实施的吗?我该如何使用它?

    我的Transformation代码(不是最终代码,我刚开始研究这个代码):

    public final class PaletteGenerator
      implements Transformation {
    
        private final int numColors;
        @Getter private Palette palette;
    
        @Override public Bitmap transform (final Bitmap source) {
            palette = null;
            final Palette palette = numColors > 0
                                    ? Palette.generate (source, numColors)
                                    : Palette.generate (source);
            return source;
        }
    
        @Override public String key () {
            return String.format (Locale.ENGLISH, "%s:%d", getClass ().getCanonicalName (), numColors);
        }
    
        public PaletteGenerator () {
            this (0);
        }
    
        public PaletteGenerator (final int c) {
            numColors = c;
        }
    }
    

2 个答案:

答案 0 :(得分:9)

根据Jake Wharton 的说法,还没有好办法

我最终做的是我使用了Transformation方法,并将丑陋的代码封装在一起。隐藏在阁楼里。

public final class PaletteGeneratorTransformation
  implements Transformation {

    private static final Map<Bitmap, Palette> CACHE = new WeakHashMap<> ();
    private final int    numColors;

    @Override public Bitmap transform (final Bitmap source) {
        if (!CACHE.containsKey (source)) {
            final Palette palette = numColors > 0
                      ? Palette.generate (source, numColors)
                      : Palette.generate (source);
            CACHE.put (source, palette);
        }

        return source;
    }

    @Override public String key () {
        return getClass ().getCanonicalName () + ":" + numColors;
    }

    public PaletteGeneratorTransformation () {
        this (0);
    }

    public PaletteGeneratorTransformation (final int c) {
        numColors = c;
    }

    public static abstract class Callback
      implements com.squareup.picasso.Callback {
        private final ImageView target;

        public Callback (final ImageView t) {
            target = t;
        }

        @Override public void onSuccess () {
            onPalette (CACHE.get (((BitmapDrawable) target.getDrawable ()).getBitmap ()));
        }

        @Override public void onError () {
            onPalette (null);
        }

        public abstract void onPalette (final Palette palette);
    }
}

在我的活动中,我按照这些方针做了一些事情:

Picasso.with(context)
    .load (getPhotoUri())
    .transform (new PaletteGeneratorTransformation (DEFAULT_NUM_COLORS))
    .into (photo, new PaletteGeneratorTransformation.Callback (photo) {
                        @Override public void onPalette (final Palette palette) {
                            themeWithPalette (palette);
                        }
                    });

剩下的唯一问题是,我知道阁楼里隐藏着丑陋的东西,现在这仍然是我肮脏的小秘密。

答案 1 :(得分:-1)

Target target = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            viewHolder.mItemImage.setImageBitmap(bitmap);
            Drawable image = viewHolder.mItemImage.getDrawable();
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {

        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {

        }
    };
    Picasso.with(viewHolder.mItemImage.getContext()).load("url").into(viewHolder.mItemImage);