我使用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
问题,这与我猜到的非常小的宽度有关。但它看起来完美渲染,直到调整图像大小。
我的代码有什么问题吗?我真的很感激任何建议。
编辑[求助]:
将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
.
*/
}
}) ;
我不确定这是否是最好的方法,但它确实有效。希望这会对某人有所帮助。