получение ширины и высоты изображения с помощью библиотеки Picasso

Я использую библиотеку picasso для загрузки и загрузки изображений в imageView. теперь я хочу знать, как я могу получить ширину и высоту изображения перед их загрузкой в ​​imageViews?

У меня есть список с адаптером, который содержит два imageView (один из них вертикальный, а другой горизонтальный). зависит от ширины и высоты изображения, я хочу загрузить изображение в одно из изображений.


person user2549089    schedule 27.08.2014    source источник
comment
Отметьте stackoverflow.com/questions/8880376/   -  person Aniruddha    schedule 27.08.2014
comment
Вы можете использовать int finalHeight = iv.getMeasuredHeight(); int finalWidth = iv.getMeasuredWidth();, где iv - ваш объект ImageView.   -  person Aniruddha    schedule 27.08.2014
comment
@Aniruddha, он просто работает после загрузки изображения в режиме просмотра изображений! но я хочу знать размер изображения перед загрузкой этого   -  person user2549089    schedule 27.08.2014
comment
stackoverflow .com / questions / 17831856 /.   -  person Aniruddha    schedule 27.08.2014


Ответы (2)


Вы можете получить размеры Bitmap только после его загрузки - вы должны использовать синхронный вызов метода следующим образом:

final Bitmap image = Picasso.with(this).load("http://").get();
int width = image.getWidth();
int height = image.getHeight();

После этого вы можете снова вызвать load с тем же URL-адресом (он будет извлечен из кеша):

 Picasso.with(this).load("http://").into(imageView)

Изменить: Может, лучше:

 Picasso.with(this).load("http://").into(new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                int width = bitmap.getWidth();
                int height = bitmap.getHeight();
                imgView.setImageBitmap(bitmap);
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {

            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {

            }
        });
person Yuraj    schedule 27.08.2014
comment
Просто для завершения ответа: вы не можете выполнить этот вызов в основном потоке, потому что это синхронно. Поэтому вам нужно запустить, например, AsyncTask, который делает это в фоновом режиме и возвращается, когда изображение было загружено. - person Klaus; 25.09.2014
comment
Это будет плохо работать с RecyclerView из-за асинхронной природы picasso в сочетании с тем фактом, что ваш ViewHolders будет переработан (многие изображения появляются в неправильных положениях при прокрутке ленты, потому что они загружаются в свое старое представление). - person Nic Robertson; 26.08.2016
comment
Воспользуйтесь вторым способом. Сначала вы получите: java.lang.IllegalStateException: вызов метода не должен происходить из основного потока. - person CoolMind; 14.02.2018

Работай на меня.

Picasso.with(context).load(imageLink).into(imageView, new Callback() {
        @Override
        public void onSuccess() {
            Picasso.with(context).load(imageLink).into(new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    int width = bitmap.getWidth();
                    int height = bitmap.getHeight();
                    Log.d("ComeHere ", " W : "+ width+" H : "+height);
                }

                @Override
                public void onBitmapFailed(Drawable errorDrawable) {

                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {

                }
            });

        }

        @Override
        public void onError() {

        }
    });
person Chattip Soontaku    schedule 27.06.2017
comment
Зачем вам снова загружать изображение внутри метода onSuccess? - person Aman Alam; 03.10.2017
comment
Поскольку он загружает изображение URL 2 раза, в первый раз он привяжет изображение к URL, во второй раз он создает поддельную цель для получения изображения ширины и высоты. Он сделает синхронизированный процесс вместо действия call 2, и они не синхронизируются - person Lê Tấn Thành; 17.03.2020