第一种是创建一个Bitmap对象并将结果复制到int []中.这适用于我的应用程序,但是在加载时整个图像在内存中两次,因为图像数据被复制到int []图像中.
Bitmap full = BitmapFactory.decodeStream(conn.getinputStream());full.getPixels(image,wIDth,height);
为了节省内存,我正在尝试使用BitmapRegionDecoder以平铺方式执行此过程.
int block = 256;BitmapRegionDecoder decoder = BitmapRegionDecoder. newInstance(conn.getinputStream(),false);Rect tileBounds = new Rect();// loop blocksfor (int i=0; i<height; i+=block) { // get vertical bounds limited by image height tileBounds.top = i; int h = i+block<height ? block : height-i; tileBounds.bottom = i+h; for (int j=0; j<wIDth; j+=block) { // get hotizontal bounds limited by image wIDth tileBounds.left = j; int w = j+block<wIDth ? block : wIDth-j; tileBounds.right = j+w; // load tile tile = decoder.decodeRegion(tileBounds,null); // copy tile in image int index = i*wIDth + j; tile.getPixels(image,index,w,h); }}
从技术上讲,这是有效的,我在int []图像中获得完整的图像.瓷砖也无缝地插入图像中.
现在我的问题.第二种方法导致图像具有某种奇怪的棋盘格扭曲.像素似乎在略微更暗或略微更轻之间交替. BitmapRegionDecoder应该支持jpeg,而BitmapFactory.decodeStream没有问题.这里有什么问题?
解决方法 找到了!显然,如果你将null提供给decoder.decodeRegion(tileBounds,null);它返回一个质量为Bitmap.Config.RGB_565的Bitmap(不确定这是否依赖于设备).简单地为它提供一个新的选项集返回Bitmap.Config.RGB_ARGB8888质量的位图.默认情况下,设置此首选质量.BitmapFactory.Options options = new BitmapFactory.Options();...// load tiletile = decoder.decodeRegion(tileBounds,options);总结
以上是内存溢出为你收集整理的android – 使用BitmapRegionDecoder加载jpeg会产生棋盘格扭曲全部内容,希望文章能够帮你解决android – 使用BitmapRegionDecoder加载jpeg会产生棋盘格扭曲所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)