Android-将大型位图加载到TouchImageView

Android-将大型位图加载到TouchImageView,android,image,bitmap,imageview,Android,Image,Bitmap,Imageview,我是Android新手,但做过一些iOS操作系统的工作。从三星S4(4.4.4)上的摄像头图像加载位图时出错: 这里的imgView是一个TouchImageView。(我尝试使用ImageViewZoom,但无法将其导入AndroidStudio。) 我得到这个错误: W/OpenGLRenderer: Bitmap too large to be uploaded into a texture (4128x3096, max=4096x4096) 来自iOS,我很惊讶Android无法从手

我是Android新手,但做过一些iOS操作系统的工作。从三星S4(4.4.4)上的摄像头图像加载位图时出错:

这里的imgView是一个TouchImageView。(我尝试使用ImageViewZoom,但无法将其导入AndroidStudio。)

我得到这个错误:

W/OpenGLRenderer: Bitmap too large to be uploaded into a texture (4128x3096, max=4096x4096)
来自iOS,我很惊讶Android无法从手机自带的摄像头加载图像!我希望有一种方法不是太难。这一定是可能的,因为画廊似乎能做到这一点。
我在网上看到的例子(建议您对图像进行二次采样)似乎没有抓住要点。通过平移和缩放(应该内置到ImageView中),图像视图只是放大图像的一个较小窗口。您不必根据视图的像素大小调整位图。我担心这个愚蠢的建议(二次抽样)反映了Android的严重缺陷。

我相信错误消息与OpenGL有关,而不是与Android有关。GPU可能会限制最大纹理分辨率。对于您的机箱,其分辨率为4096x4096像素。建议开发人员将缩小的版本加载到UI中,因为在有限的屏幕显示(如手机)中查看大型图像是不合理的。更多关于这方面的信息可以找到


如果您需要查看实际大小的大图像,那么您可以只绘制图像的可见部分。

我认为答案是“不容易”。我怀疑这一点,但必须检查以确定。我确实发现清单中的设置
android:hardwareAccelerated=“false”
允许加载大型位图,但应用程序很快就会内存不足。有趣的是,缺乏硬件加速似乎并没有对性能产生太大影响。

我的库就是为了解决这个问题而设计的,它首先对图像进行二次采样,然后在放大时加载更高分辨率的分幅。如果你仔细观察,你会发现大多数Android gallery应用程序都做同样的事情


如果任何尺寸较大,您可以获得最大纹理大小和缩放图像

不幸的是,我不记得从哪里得到这个片段(它不是我的)。 在相当长一段时间的生产中,它可以很好地实现这一目的

public int providedextxtureresize(){
EGL10 egl=(EGL10)EGLContext.getEGL();
EGLDisplay dpy=egl.eglGetDisplay(EGL10.egl_默认_显示);
int[]vers=新的int[2];
egl.eglinitalize(dpy,vers);
int[]配置属性={
EGL10.EGL_颜色_缓冲区_类型,EGL10.EGL_RGB_缓冲区,
EGL10.EGL_级,0,
EGL10.EGL_表面类型,EGL10.EGL_缓冲位,
EGL10.EGL_无
};
EGLConfig[]configs=新的EGLConfig[1];
int[]numConfig=newint[1];
egl.eglChooseConfig(dpy,configAttr,configs,1,numConfig);
if(numConfig[0]==0){
//麻烦!找不到配置文件。
}
EGLConfig config=configs[0];
int[]surfAttr={
EGL10.EGL_宽度,64,
EGL10.EGL_高度,64,
EGL10.EGL_无
};
EGLSurface surf=egl.eglCreatePbufferSurface(dpy,config,surfAttr);
final int EGL_CONTEXT_CLIENT_VERSION=0x3098;//EGL10中缺少
int[]ctxAttrib={
EGL_上下文_客户端_版本,1,
EGL10.EGL_无
};
EGLContext ctx=egl.eglCreateContext(dpy,config,EGL10.egl\u NO\u CONTEXT,ctxAttrib);
egl.eglMakeCurrent(dpy、surf、surf、ctx);
int[]maxSize=新int[1];
GLES10.glGetIntegerv(GLES10.GLU最大纹理大小,最大大小,0);
egl.eglMakeCurrent(dpy,EGL10.egl_无_表面,EGL10.egl_无_表面,
EGL10.EGL(无上下文);
egl.eglDestroySurface(dpy,surf);
egl.eglDestroyContext(dpy,ctx);
乙二醇酯(dpy);
返回maxSize[0];
}

iPhone是一款手机,没有这样的限制。Android因为蜂巢使用GPU硬件加速来显示屏幕上显示的所有内容。所以
视图
基本上就是3D多边形,纹理附在上面。它是由安卓系统完成的,对开发者来说是透明的,而在iOS系统中,情况并非如此。这看起来是一个很好的库。不幸的是,除了显示,我的应用程序还需要访问整个位图进行图像处理。
W/OpenGLRenderer: Bitmap too large to be uploaded into a texture (4128x3096, max=4096x4096)