Android:位图的最大允许宽度和高度

Fre*_*dkr 28 android bitmap

我正在创建一个需要将大图像解码为位图的应用程序,以便在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毫秒.


Geo*_*its 9

此限制应来自底层的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等),这只是查询最大大小的大量开销.

  • 您可以在不创建OpenGL上下文的情况下查询OpenGL,因为glGetIntegerv是一个静态方法:`GLES10.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE,maxSize,0);` (17认同)
  • 不幸的是,我也使用静态方法得到了零. (6认同)