加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

imageview设置图片时超长超大图片超出限制(OpenGLRenderer: Bit

发布时间:2020-12-14 04:34:09 所属栏目:大数据 来源:网络整理
导读:问题:遇到超长图片,宽长等比缩放,比如宽度同屏幕同宽,长度等比放大,放到后遇到长度超出OpenGLRenderer的最大限制,导致图片无法显示出来: 解决办法: // 图片超出GPU对于openglRender最大限制缩放处理 if (height getOpenglRenderLimitValue()){ width

问题:遇到超长图片,宽长等比缩放,比如宽度同屏幕同宽,长度等比放大,放到后遇到长度超出OpenGLRenderer的最大限制,导致图片无法显示出来:

解决办法:

            //图片超出GPU对于openglRender最大限制缩放处理
            if(height > getOpenglRenderLimitValue()){
                width = width * getOpenglRenderLimitValue() / height;
                height = getOpenglRenderLimitValue();
            }
  public static int getOpenglRenderLimitValue() {
        int maxsize ;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            maxsize = getGLESTextureLimitEqualAboveLollipop();
        }else {
            maxsize = getOpenglRenderLimitBelowLollipop();
        }
        return maxsize ==0 ? 4096 : maxsize;
    }

    private static int getOpenglRenderLimitBelowLollipop() {
        int[] maxSize =new int[1];
        GLES10.glGetIntegerv(GLES10.GL_MAX_TEXTURE_SIZE,maxSize,0);
        return maxSize[0];
    }

    private static int getGLESTextureLimitEqualAboveLollipop() {

        EGL10 egl = (EGL10) EGLContext.getEGL();
        EGLDisplay dpy = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
        int[] vers = new int[2];
        egl.eglInitialize(dpy,vers);
        int[] configAttr = {
                EGL10.EGL_COLOR_BUFFER_TYPE,EGL10.EGL_RGB_BUFFER,EGL10.EGL_LEVEL,0,EGL10.EGL_SURFACE_TYPE,EGL10.EGL_PBUFFER_BIT,EGL10.EGL_NONE
        };
        EGLConfig[] configs = new EGLConfig[1];
        int[] numConfig = new int[1];
        egl.eglChooseConfig(dpy,configAttr,configs,1,numConfig);
        if (numConfig[0] == 0) {// TROUBLE! No config found.
        }
        EGLConfig config = configs[0];
        int[] surfAttr = {
                EGL10.EGL_WIDTH,64,EGL10.EGL_HEIGHT,EGL10.EGL_NONE
        };
        EGLSurface surf = egl.eglCreatePbufferSurface(dpy,config,surfAttr);
        final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;  // missing in EGL10
        int[] ctxAttrib = {
                EGL_CONTEXT_CLIENT_VERSION,EGL10.EGL_NONE
        };
        EGLContext ctx = egl.eglCreateContext(dpy,EGL10.EGL_NO_CONTEXT,ctxAttrib);
        egl.eglMakeCurrent(dpy,surf,ctx);
        int[] maxSize = new int[1];
        GLES10.glGetIntegerv(GLES10.GL_MAX_TEXTURE_SIZE,0);
        egl.eglMakeCurrent(dpy,EGL10.EGL_NO_SURFACE,EGL10.EGL_NO_CONTEXT);
        egl.eglDestroySurface(dpy,surf);
        egl.eglDestroyContext(dpy,ctx);
        egl.eglTerminate(dpy);

        return maxSize[0];
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读