如何使用 Firebase 中的 Glide 仅加载部分图像?

Posted

技术标签:

【中文标题】如何使用 Firebase 中的 Glide 仅加载部分图像?【英文标题】:How to load only part of image with Glide from Firebase? 【发布时间】:2017-02-20 09:57:24 【问题描述】:

我有 imageview,它应该只显示图像的一部分(适合屏幕的一部分)。用户单击后,它将打开整个图像。但我不知道如何仅将部分图像加载到 imageview 中。问题是 Glide 总是将图像放入 imageview 中。

Glide.with(context)
     .using(new FirebaseImageLoader())
     .load(storageReference)
     .into(imageView);

现在的样子。红色部分为 ImageView。

我多么希望拥有它。

编辑

以下代码会适合,但它会显示整个图像,仅显示其中的一部分,并且会破坏比例。

android:scaleType="fitXY"
android:adjustViewBounds="true"

【问题讨论】:

在更新为imageView之前可以使用simpletarget处理图片 我更新了答案 【参考方案1】:

在您的XMLImageView 中添加比例类型。添加这个android:scaleType="matrix"

【讨论】:

我认为你应该在负值中添加 marginRight 和 marginBottom。 android:scaleType="matrix" 是解决方案。我遇到了问题,该图像没有足够的点来覆盖从一侧显示到另一侧的图像视图。这可以通过重新采样图像或使用 android:scaleY 和 android:scaleX 来处理。 好的,希望你喜欢我的解决方案。添加你也可以应用我的第二个解决方案。因为你的 ImageView 从右和底部切开,这会给你想要的效果。【参考方案2】:
Glide.with(mContext)
                .using(new FirebaseImageLoader())
                .load(storageReference)
                .asBitmap()
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)
                .into(new SimpleTarget<Bitmap>() 
                    @Override
                    public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) 
                        Bitmap targetBitmap = Bitmap.createBitmap(resource, x, y, width, height);
                        imageView.setImageBitmap(targetBitmap);
                    
                );

您可以在此处根据您的尺寸从 Glide 调整位图的大小。但请确保您提供的尺寸始终小于实际位图。

由于您在列表中使用此代码,因此应全局声明 Bitmap targetBitmap; 以在整个列表中重用相同的位图对象。这将减少您应用的 RAM 消耗。

如果您需要更清晰的代码Bitmap targetBitmap = Bitmap.createBitmap(resource, x, y, width, height);,请阅读与裁剪位图相关的链接

不要忘记将targetBitmap设为Global,否则内存影响太大。

【讨论】:

【参考方案3】:

只需将其添加到您的 Imageview 中

android:adjustViewBounds="true"
    android:scaleType="fitXY"

【讨论】:

这只会使图像适合 ImageView 而没有任何不需要的背景。但是这家伙想要显示图像的一部分。 谢谢,但这似乎不是解决方案,正如您在我的问题编辑中看到的那样。 你尝试过其他的 scaletypes 吗?像矩阵,centercrop等 我尝试了矩阵(它非常接近所需的结果,但它不适合左右两侧的图像 - 左右两侧都有空间)并且我不想居中,因为我必须显示图像的顶部。 FitStart 也不好,其余的都是中心。【参考方案4】:

将此添加到您的 xml 中

 android:scaleType="fitXY"
 android:adjustViewBounds="true"

【讨论】:

谢谢,但这似乎不是解决方案,正如您在我的问题编辑中看到的那样。 你也可以使用android:scaleType="centerCrop"【参考方案5】:

好的,感谢 Mohammed Atif、Patel Jaimin 和 Henry,我最终得到了以下解决方案。

<ImageView
 android:id="@+id/ivImage"
 android:layout_
 android:layout_
 android:scaleType="matrix"/>

 Glide.with(this)
        .using(new FirebaseImageLoader())
        .load(storageReference)
        .asBitmap()
        .into(new SimpleTarget<Bitmap>() 
         @Override
         public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) 
                    Bitmap targetBitmap = Bitmap.createBitmap(resource, 0, 0, resource.getWidth(), resource.getHeight());
                    ivImage.setImageBitmap(targetBitmap);

                    final Matrix matrix = ivImage.getImageMatrix();
                    final float imageWidth = ivImage.getDrawable().getIntrinsicWidth();
                    final float scaleRatio = ivImage.getWidth() / imageWidth;
                    matrix.postScale(scaleRatio, scaleRatio);
                    ivImage.setImageMatrix(matrix);
                
            );

【讨论】:

以上是关于如何使用 Firebase 中的 Glide 仅加载部分图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何从firebase存储中获取图片,图片的网址在firestore中。

Android Glide 和 Firebase 存储:将连续图像从 Firebase 存储加载到 Imageview - 闪烁

在最新的 Firebase 版本 (10.2.4) 中使用 Glide 和 FirebaseUI 加载图像

如何在 Entity Framework 6.1 中仅加载子对象的某些字段?

从表单尝试时记录集不可更新,但如果仅加载子表单,则可以正常工作

使用 Glide 和 RecyclerView 上下滚动时图像消失,图像之间的空间增加