【问题标题】:How do I get a Palette for my bitmap once Picasso Loads it?毕加索加载后,如何为我的位图获取调色板?
【发布时间】:2023-03-25 14:20:01
【问题描述】:

2014 年 10 月,Jake Wharton 写信给Coercing Picasso to Play With Palette。其中,有两种方法正在思考:

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

  2. 使用CallbackonSuccessImageView 获取位图并生成调色板。我忍不住把注意力集中在 Jake 放在这行末尾的 // Ew! 上,我非常同意。

上面提到的帖子写于 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;
    }
}

【问题讨论】:

    标签: android picasso android-palette


    【解决方案1】:

    根据 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);
        }
    }
    

    在我的 Activity 中,我按照以下方式做一些事情:

    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);
                            }
                        });
    

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

    【讨论】:

      【解决方案2】:
      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);
      

      【讨论】:

      • 这里没有提到调色板或调色板生成。我认为你没有读过这个问题。
      • 此外,这种方法充其量只会在加载位图之后开始生成调色板。我必须将它放回后台线程并将生成的调色板(如果有)发布到 UI 线程以将调色板应用到活动。
      • 我不明白为什么投反对票,你得到了位图,然后你可以从那里调用 Pallete generation...
      • 我只是建议了另一种获取位图的方法
      • 这没有回答所提出的问题。
      猜你喜欢
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 2017-08-06
      • 2015-11-16
      • 2014-10-08
      相关资源
      最近更新 更多