Android - Glide通过"覆盖"来调整图像大小和#34; fitCenter"变形位图

时间:2016-08-28 02:15:41

标签: java android bitmap android-glide

我使用Glide将图片从图库加载到GLSurfaceView。但是,当我尝试使用override(width, height)调整图像大小时,它不会这样做。因此,我添加了fitCenter(),这似乎是获得所需大小的关键。

我的问题是当Bitmap调整大小时,结果很奇怪!除了宽度值较小的图像外,一切都很好。附图说明了使用和不使用fitCenter()之间的区别。

这是我用于通过Glide加载的代码

Glide.with(this)
    .load(imageUri)
    .asBitmap()
    .override(newWidth, newHeight)
    .fitCenter()
    .atMost()
    .into(new SimpleTarget<Bitmap>(newWidth, newHeight) {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
            Log.e(TAG, "Loaded Bitmap Size :" + resource.getWidth() + "x" + resource.getHeight());
            /*
            .
            . Initialize GLSurfaceView with Bitmap resource
            .
            */
        }
    }) ;

我想了一下它可能是一个GLSurfaceView问题,这与我猜到的非常小的宽度有关。但它看起来完美渲染,直到调整图像大小。

我的代码有什么问题吗?我真的很感激任何建议。

enter image description here

编辑[求助]:
fitCenter()GLSurfaceView一起使用,Bitmap的宽度或高度为奇数时,看起来会出现此问题。我通过将以下自定义转换添加到Glide调用来解决此问题。

@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int maxWidth, int maxHeight) {
    if (maxHeight > 0 && maxWidth > 0) {
        int width = toTransform.getWidth();
        int height = toTransform.getHeight();

        float ratioBitmap = (float) width / (float) height;
        float ratioMax = (float) maxWidth / (float) maxHeight;

        int finalWidth = maxWidth;
        int finalHeight = maxHeight;
        if (ratioMax > ratioBitmap) {
            finalWidth = (int) ((float) maxHeight * ratioBitmap);
        } else {
            finalHeight = (int) ((float)maxWidth / ratioBitmap);
        }

        return Bitmap.createScaledBitmap(toTransform, previousEvenNumber(finalWidth), previousEvenNumber(finalHeight), true);
    }
    else {
        return toTransform;
    }
}

private int previousEvenNumber(int x){
    if ( (x & 1) == 0 )
        return x;
    else
        return x - 1;
}

编辑Glide会调用以下内容:

Glide.with(this)
    .load(imageUri)
    .asBitmap()
    .override(newWidth, newHeight)
    .transform(new CustomFitCenter(this))
    .into(new SimpleTarget<Bitmap>() {
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
            Log.e(TAG, "Loaded Bitmap Size :" + resource.getWidth() + "x" + resource.getHeight());
            /*
            .
            . Initialize GLSurfaceView with Bitmap resource
            .
            */
        }
    }) ;

我不确定这是否是最好的方法,但它确实有效。希望这会对某人有所帮助。

0 个答案:

没有答案