如何使用适用于Android的Glide压缩和降低图像质量

时间:2018-09-13 13:05:00

标签: java android android-glide

我正在使用Glide库上传图像。在我的另一个应用程序中,我使用此代码

void imageButtonclick() {
        iv1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                CropImage.activity(filePath).setGuidelines(CropImageView.Guidelines.ON)
                    .setAspectRatio(1,1).setOutputCompressQuality(50).start(UploadBook.this);

                // Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    //intent.putExtra(MediaStore.EXTRA_OUTPUT,imageuri);
                    //startActivityForResult(intent, CAMERA_REQUEST_CODE);
            }
        });

通过声明.setOutputCompressQuality(50)来减小图像的大小,但是我不知道如何使用Glide Image库做同样的事情。

我的代码是

public static void loadLocalImage(Context ctx, RequestOptions glideRequests, Uri uri, ImageView imageView,
                                      RequestListener listener) {

        glideRequests.fitCenter()
                .skipMemoryCache(true)
                .diskCacheStrategy(DiskCacheStrategy.NONE);
        Glide.with(ctx)
                .applyDefaultRequestOptions(glideRequests.placeholder(R.drawable.ic_stub).error(R.drawable.ic_stub))
                .asBitmap()
                .load(uri)
                .listener(listener)
                .into(imageView);

    }

3 个答案:

答案 0 :(得分:3)

来自Glide official site

  

默认情况下,Glide更喜欢RGB_565,因为它仅需要两个字节   每个像素(16位),因此只有   更高的质量和系统默认值ARGB_8888。

因此您不能再降低位图的质量,但是还有其他选择。

选项1 :使用override(x, y)调整图像大小。

RequestOptions myOptions = new RequestOptions()
    .override(100, 100);

Glide.with(fragment)
    .asBitmap()
    .apply(myOptions)
    .load(url)
    .into(bitmapView);

选项2 :使用centerCropfitCenter

缩放图像
  

centerCrop()是一种裁剪技术,可缩放图像以使其   填充ImageView的请求范围,然后裁剪多余的内容。   ImageView将被完全填充,但是整个图像可能   不显示。

RequestOptions myOptions = new RequestOptions()
    .centerCrop();

Glide.with(ctx)
    .asBitmap()
    .apply(myOptions)
    .load(url)
    .into(bitmapView);
  

fitCenter()是一种裁剪技术,可缩放图像,以使两者   尺寸等于或小于所要求的范围   ImageView。图像将完全显示,但可能无法填满   整个ImageView。

RequestOptions myOptions = new RequestOptions()
        .fitCenter();

    Glide.with(ctx)
        .asBitmap()
        .apply(myOptions)
        .load(url)
        .into(bitmapView);

选项3 :混合使用这两种解决方案

RequestOptions myOptions = new RequestOptions()
    .fitCenter() // or centerCrop
    .override(100, 100);

 Glide.with(ctx)
     .asBitmap()
     .apply(myOptions)
     .load(url)
     .into(bitmapView);

答案 1 :(得分:1)

尝试一下

Glide
    .with(ctx)
    .load(url)
    .apply(new RequestOptions().override(600, 200))
    .into(imageView);

答案 2 :(得分:0)

为此,我的解决方案使用Kotlin的扩展功能。使用图像的宽度和高度可以提高效率。在某些情况下,您可能需要在宽度和高度上添加一个乘数以提高质量。

    fun ImageView.loadImage(uri: String) {

        this.post {

            val myOptions = RequestOptions()
               .override(this.width, this.height)
               .centerCrop()

            Glide
               .with(this.context)
               .load(uri)
               .apply(myOptions)
               .into(this)

        }

    }