小米3手机上加载相册图片失败的问题

机型小米3W,ROM4.4.4废话不多说,在加载相册图片时报了这样一个错误

09-16 12:26:53.270: W/OpenGLRenderer(21987): Bitmap too large to be uploaded into a texture (4208x2368, max=4096x4096)

裁剪呗,网上找了个算法,挺好使,贴到这里,记录下

在做相册应用的过程中,需要得到一个压缩过的缩略图但,同时我还希望得到的bitmap能够是正方形的,以适应正方形的imageView,传统设置inSampleSize压缩比率的方式只是压缩了整张图片,如果一个图片的长宽差距较大,则展示出来的时候会有拉伸的现象,因此正确的做法是在压缩之后,对bitmap进行裁剪。

代码如下:

给定图片维持宽高比缩放后,截取正中间的正方形部分

 1 /**
 2
 3    * @param bitmap      原图
 4    * @param edgeLength  希望得到的正方形部分的边长
 5    * @return  缩放截取正中部分后的位图。
 6    */
 7   public static Bitmap centerSquareScaleBitmap(Bitmap bitmap, int edgeLength)
 8   {
 9    if(null == bitmap || edgeLength <= 0)
10    {
11     return  null;
12    }
13
14    Bitmap result = bitmap;
15    int widthOrg = bitmap.getWidth();
16    int heightOrg = bitmap.getHeight();
17
18    if(widthOrg > edgeLength && heightOrg > edgeLength)
19    {
20     //压缩到一个最小长度是edgeLength的bitmap
21     int longerEdge = (int)(edgeLength * Math.max(widthOrg, heightOrg) / Math.min(widthOrg, heightOrg));
22     int scaledWidth = widthOrg > heightOrg ? longerEdge : edgeLength;
23     int scaledHeight = widthOrg > heightOrg ? edgeLength : longerEdge;
24     Bitmap scaledBitmap;
25
26           try{
27            scaledBitmap = Bitmap.createScaledBitmap(bitmap, scaledWidth, scaledHeight, true);
28           }
29           catch(Exception e){
30            return null;
31           }
32
33        //从图中截取正中间的正方形部分。
34        int xTopLeft = (scaledWidth - edgeLength) / 2;
35        int yTopLeft = (scaledHeight - edgeLength) / 2;
36
37        try{
38         result = Bitmap.createBitmap(scaledBitmap, xTopLeft, yTopLeft, edgeLength, edgeLength);
39         scaledBitmap.recycle();
40        }
41        catch(Exception e){
42         return null;
43        }
44    }
45
46    return result;
47   }

需要注的是bitmap参数一定要是从原图得到的,如果是已经经过BitmapFactory inSampleSize压缩过的,可能会不是到正方形。

原始页面在这里

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0917/1686.html
时间: 2024-10-11 16:58:23

小米3手机上加载相册图片失败的问题的相关文章

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

Android 高效加载大图片避免OOM

参考链接:http://blog.csdn.net/coderinchina/article/details/40964205 我们项目中经常会加载图片,有时候如果加载图片过多的话,小则导致程序很卡,重则OOM导致App挂了,今天翻译https://developer.android.com/training/displaying-bitmaps/index.html,学习Google高效加载大图片的方法. 图片有各种形状和大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统

Android ListView 图片异步加载和图片内存缓存

开发Android应用经常需要处理图片的加载问题.因为图片一般都是存放在服务器端,需要联网去加载,而这又是一个比较耗时的过程,所以Android中都是通过开启一个异步线程去加载.为了增加用户体验,给用户省流量,一般把加载完的图片先缓存下来,下次加载的时候就不需要再联网去服务器端加载.图片缓存一般分为一级缓存(即内存缓存)和二级缓存(即磁盘缓存).这里只讲一级缓存. 内存缓存就是把加载完的图片先放在手机内存中,等下次加载的时候再从内存中取出来. 优点是速度快,缺点是不能长久保存,用户退出应用程序之

[android] 加载大图片到内存

默认情况下,android程序分配的堆内存大小是16,虚拟机上面的VM Heep就是设置它的 一个图片所占的内存,比如1920*2560像素的图片需要,1920*2560*3至少这些的内存byte 找到ImageView控件对象 调用BitmapFactory对象的decodeFile(pathName)方法,来获取一个位图对象,参数:pathName是String类型的图片路径 把图片导入到手机的sdcard目录下面 调用ImageView对象的setImageBitmap(bitemap)方

Fresco 使用笔记(一):加载gif图片并播放

前言: 项目中图文混合使用的太多太多了,但是绝大部分都是静态图片. 然而现在项目开发中有这么一个需求:显示一个出一个简短的动画(一般都不超过3秒)演示 比如说:一个功能提供很多步骤来教用户做广播体操,那么第一步就显示一个3秒钟的动作图,第二步显示一个几秒钟的动作图.(当然这个需求不是这个功能) 怎么解决呢:一确定这个需求我的第一实现思路便是让美工给我搞几个连续的图片,我使用帧动画来轮回播放 便实现了这个动画. 但是帧动画使用起来太复杂了,一套动作我要搞好久来实现.那么就想Android中支持不支

android95 缩放加载大图片

MainActivity: package com.itheima.loadimage; import android.os.Bundle; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.graphics.Point; i

Android加载大图片到内存

加载大图片到内存 步骤: 步骤一: 获取品屏幕的宽高数据;[HD1] 步骤二: 获取图片的宽高;[HD2] 步骤三: 计算屏幕与图片的宽高比例,按照差距最大的进行缩放处理;[HD3] 步骤四: 图片的缩放处理;[HD4] [HD1]// 获取手机的屏幕的窗体大小 WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display display = windowManager.getDef

Android Bitmap 全面解析(一)加载大尺寸图片

压缩原因:1.imageview大小如果是200*300那么加载个2000*3000的图片到内存中显然是浪费可耻滴行为;2.最重要的是图片过大时直接加载原图会造成OOM异常(out of memory内存溢出)所以一般对于大图我们需要进行下压缩处理权威处理方法参考 安卓开发者中心的大图片处理教程http://developer.android.com/training/displaying-bitmaps/load-bitmap.html看不懂英文的话木有关系,本篇会有介绍主要处理思路是:1.获