我正在创建一个需要将大图像解码为位图的应用程序,以便在ImageView中显示.
如果我只是尝试将它们直接解码为位图,我会收到以下错误"位图太大而无法上传到纹理中(1944x2592,max = 2048x2048)"
因此,为了能够使用以下方法显示分辨率过高的图像:
Bitmap bitmap = BitmapFactory.decodeFile(path);
if(bitmap.getHeight()>=2048||bitmap.getWidth()>=2048){
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int width = metrics.widthPixels;
int height = metrics.heightPixels;
bitmap =Bitmap.createScaledBitmap(bitmap, width, height, true);
}
Run Code Online (Sandbox Code Playgroud)
这有效,但我真的不想像现在的if语句那样对2048的最大值进行硬编码,但是我无法找到如何获得设备位图的最大允许大小
有任何想法吗?
Pkm*_*mte 13
获得最大允许大小的另一种方法是遍历所有EGL10配置并跟踪最大尺寸.
public static int getMaxTextureSize() {
// Safe minimum default size
final int IMAGE_MAX_BITMAP_DIMENSION = 2048;
// Get EGL Display
EGL10 egl = (EGL10) EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
// Initialise
int[] version = new int[2];
egl.eglInitialize(display, version);
// Query total number of configurations
int[] totalConfigurations = new int[1];
egl.eglGetConfigs(display, null, 0, totalConfigurations);
// Query actual list configurations
EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]];
egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations);
int[] textureSize = new int[1];
int maximumTextureSize = 0;
// Iterate through all the configurations to located the maximum texture size
for (int i = 0; i < totalConfigurations[0]; i++) {
// Only need to check for width since opengl textures are always squared
egl.eglGetConfigAttrib(display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize);
// Keep track of the maximum texture size
if (maximumTextureSize < textureSize[0])
maximumTextureSize = textureSize[0];
}
// Release
egl.eglTerminate(display);
// Return largest texture size found, or default
return Math.max(maximumTextureSize, IMAGE_MAX_BITMAP_DIMENSION);
}
Run Code Online (Sandbox Code Playgroud)
从我的测试来看,这非常可靠,并且不需要您创建实例.性能方面,我在Note 2上执行了18毫秒,在G3上只执行了4毫秒.
此限制应来自底层的OpenGL实现.如果你已经在你的应用程序中使用OpenGL,你可以使用这样的东西来获得最大尺寸:
int[] maxSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxSize, 0);
// maxSize[0] now contains max size(in both dimensions)
Run Code Online (Sandbox Code Playgroud)
这表明我的Galaxy Nexus和Galaxy S2的最大值都是2048x2048.
不幸的是,如果您还没有使用它,获取OpenGL上下文来调用它的唯一方法是创建一个(包括surfaceview等),这只是查询最大大小的大量开销.
| 归档时间: |
|
| 查看次数: |
34030 次 |
| 最近记录: |