安卓:Glide无法显示来自URL的大型图像

8

我试图从URL中加载一张分辨率较高的大型图片(3225x4800)到Glide中,供一家报社使用。我想要加载的图片是这张高分辨率图片

String url = "http://www.businessweekmindanao.com/content/wp-content/uploads/2015/10/fitness-and-wellness-poster-final.jpg";

Glide.with(getActivity()).load(url).asBitmap().into(new SimpleTarget<Bitmap>() {
    @Override
    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
        imageView.setImageBitmap(resource);
    }
});

我正在使用Mike Ortiz的TouchImageView,它是从这里提供的解决方案中获取的:https://github.com/MikeOrtiz/TouchImageView/issues/135。但似乎它只能用于小分辨率图像,并且无法加载高质量图像。
有一个备选方案我在stackoverflow上尝试过:Android: not displayed ImageView with UIL and TouchImageView,其中修改了Mike库的onMeasure()方法。它可以与以下一起使用:
Glide.with(getActivity()).load(url)
                .into(imageViewPreview);

问题是它以非常低的分辨率加载图像。

是否有一种使用Glide和TouchImageView加载高分辨率图像(例如7480x3740)的方法?我该怎么做?


请计算在内存中会占用多少字节:7480x3740x4。 - greenapps
请以这样的方式发布URL,以便我们可以单击链接查看图片。 - greenapps
@ greenapps 谢谢您的评论。链接在字符串变量中:http://www.businessweekmindanao.com/content/wp-content/uploads/2015/10/fitness-and-wellness-poster-final.jpg - OBL
字符串变量中包含了链接:不是的,那是URL。现在我才能点击。谢谢。但是为什么你没有对那个计算做出反应呢? - greenapps
4个回答

12

我已经找到了一个符合我的需求的解决方案。override()方法能够解决问题。将目标分辨率设置得更高似乎是最终的解决办法,但是数字越大,显示图像所需要的时间就越长,因此最好实现一个预加载程序/进度条。

Glide.with(getContext())
    .asBitMap() //[for new glide versions]
    .load(url)
    //.asBitmap()[for older glide versions]
    //.placeholder(R.drawable.default_placeholder)
    .override(1600, 1600) // Can be 2000, 2000
    .into(new BitmapImageViewTarget(imageViewPreview) {
        @Override
        public void onResourceReady(Bitmap  drawable, GlideAnimation anim) {
            super.onResourceReady(drawable, anim);
            progressBar.setVisibility(View.GONE);
        }
    });

在RelativeLayout xml上创建自定义居中的预加载器/进度条占位符指示器:

<ProgressBar
    android:id="@+id/progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true" />

这很不错,因为Glide加载图像时使用asBitmap()时,与显示错误占位符和预加载器/进度指示器有关的另一个问题不会出现:

Glide.with(getActivity())
    .load(url).asBitmap()
    .placeholder() //<== will simply not work:
    .error() // <== is also useless
    .into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
        imageView.setImageBitmap(resource);
    }
});

在我的研究中,我也尝试了一种毕加索方案来处理高质量的图像:

Picasso.with(getContext())
                .load(url)
                .resize(1500, 0)
                .placeholder(R.drawable.default_placeholder)
                .error(R.drawable.download_error)
                .into(imageViewPreview);
在最后,我对Glide版本感到满意。
希望这对可能面临相同挑战的任何人都有所帮助。

4

我在使用Glide将URL中的图像加载到TouchImageView时遇到了问题。它会显示一个黑屏。

我找到了一种解决方法,如下所示。在Glide覆盖方法中传递宽度和高度,在设置位图后调用TouchImageView的setZoom方法,并将值设置为1。

以下是完整代码:

Glide.with('context')
                    .asBitmap()
                    .load('url')
                    .apply(new RequestOptions().override(1600, 1600)) //This is important 
                    .into(new BitmapImageViewTarget('imageview') {
                        @Override
                        public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                            super.onResourceReady(resource, transition);
                            'imageview'.setImageBitmap(resource);
                            'imageview'.setZoom(1); //This is important
                        }
                    });

找不到 setZoom(1)! - Arnold Brown
2
@ArnoldBrown 这是针对TouchImageView而不是ImageView的。我刚刚检查了这个https://github.com/MikeOrtiz/TouchImageView的github存储库,他们仍然有setZoom方法。 - Shivam Pokhriyal
这对我来说是工作,不需要 .setZoom(1)。谢谢。但是为什么我们要应用代码? - Vrajesh

1

添加android:usesCleartextTraffic="true"

Glide将开始在Android 10中加载图片


请具体说明,新手可能无法理解。在哪里添加这个标签? - Pratik Butani
我们需要在我们的清单文件中添加 <application> 标签。 - Ekta Dushanj
谢谢。将其添加到 AndroidManifest.xml<application 标签中就可以了。但是,你知道为什么这样做会起作用吗,@EktaDushanj? - nebulasmoothie
基本上,这使应用程序能够使用在Android-10中默认被阻止的HTTP协议。如果您对图像有控制权,则更好的解决方案是使用HTTPS。 - Saty

0

我也遇到了同样的问题,原因是图片太大了。我通过以下方式解决了这个问题:

    Glide
    .with(imageView.context)
    .load(url)
    .placeholder(R.drawable.placeholder)
    .apply(RequestOptions().transform(CenterCrop(), RoundedCorners(if (applyCorner) 32 else 1)))
    .into(object : CustomTarget<Drawable>(200, 200) {
        override fun onLoadCleared(placeholder: Drawable?) {
            // called when imageView is cleared. If you are referencing the bitmap
            // somewhere else too other than this imageView clear it here
        }

        override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
            imageView.setImageDrawable(resource)
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接