Android: desliza la imagen a través de "anulación" y "fitCenter" deforma Bitmap

Estoy usando Glide para cargar imágenes de la galería en GLSurfaceView . Sin embargo, cuando traté de cambiar el tamaño de la imagen utilizando override(width, height) , no lo hace. Por lo tanto, he añadido fitCenter() , que parece ser la clave para obtener el tamaño deseado.

Mi problema es cuando el Bitmap se redimensiona el resultado es bastante raro! Todo es bueno, excepto para las imágenes que tienen valores de ancho pequeño. Las imágenes adjuntas ilustran la diferencia entre usar y no usar fitCenter() .

Aquí está el código que usé para cargar a través de 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 . */ } }) ; 

Pensé por un segundo que puede ser un problema de GLSurfaceView , algo relacionado a la anchura muy pequeña que adiviné. Pero parece que se procesa perfectamente hasta que la imagen se redimensiona.

¿Hay algo malo en mi código? Realmente agradecería cualquier sugerencia.

introduzca la descripción de la imagen aquí

EDITAR [SOLUCIONADO]:
Parece que el problema se produce cuando se utiliza fitCenter() con GLSurfaceView con un Bitmap que tiene anchura o altura como un número impar. Solucioné el problema añadiendo la siguiente transformación personalizada a la llamada 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; } 

Y la edición Glide llama a lo siguiente:

 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 . */ } }) ; 

No estoy seguro si es la mejor manera de hacerlo, pero funcionó. Espero que esto ayude a alguien.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.