文档章节

android开发笔记之多媒体—大图片的加载

Mr_Nice
 Mr_Nice
发布于 2016/05/22 20:00
字数 634
阅读 1
收藏 0
点赞 2
评论 0

1.将图片导入到SD卡

这里写图片描述

2.从SD中获取图片

String path = Environment.getExternalStorageDirectory() + "/img_big_1.jpg";
bitmap = BitmapFactory.decodeFile(path, options);

3.为这种图片设置采样率(即压缩比)

Options options = new Options();
            //设置图片的采样率
            options.inSampleSize = scale;  //假设为4,表示原来宽高的1/4,原来为2560*1600变成了640*400

4.最后将图片显示到ImageView组件上

iv.setImageBitmap(bitmap);

5.加上相应权限

//读SD卡的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/>

不过我们这次这个采样率得计算一下,因为我们需要让图片以最合适的大小显示到当前屏幕上:

private Bitmap getScaleBitmap(String path) {
        Bitmap bitmap = null;
        try {
            ExifInterface exifInterface = new ExifInterface(path);
            imageWidth = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0);
            imageHeight = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0);
            int scaleX = (int) (imageWidth*0.1f/screenWidth + 0.5f); //加0.5f是为了四舍五入
            int scaleY = (int) (imageHeight*0.1f/screenHeight + 0.5f);
            int scale = (int)( Math.sqrt(scaleX*scaleX + scaleY*scaleY) + 0.5f);
            Options options = new Options();
            //设置图片的采样率
            options.inSampleSize = scale;  //假设为4,表示原来宽高的1/4,原来为2560*1600变成了640*400
            bitmap = BitmapFactory.decodeFile(path, options);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

当然要知道这个比,就还应该得到屏幕的宽高

// 获取Android屏幕的信息
    private void getScreenWith() {
        //三种方式
        //第一种
// WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// width = windowManager.getDefaultDisplay().getWidth();
// height = windowManager.getDefaultDisplay().getHeight();

        //第二种
// Point point = new Point();
// WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// windowManager.getDefaultDisplay().getSize(point);
// width = point.x;
// height = point.y;

        //第三种
        DisplayMetrics metric = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metric);
        screenWidth = metric.widthPixels;   //屏幕宽度
        screenHeight = metric.heightPixels;  //屏幕高度
    }

核心代码:

/** * 从SD卡中加载大图片 * @author Administrator * */
public class MainActivity extends Activity {

    private ImageView iv;
    private int screenWidth,screenHeight; //屏幕的宽高
    private int imageWidth,imageHeight;   //图片的宽高
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv = (ImageView) findViewById(R.id.iv);
    }
    //从SD卡中加载图片
    public void loadimage(View view) {
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
            String path = Environment.getExternalStorageDirectory() + "/img_big_1.jpg";
            getScreenWith();
            Bitmap bitmap = getScaleBitmap(path);
            iv.setImageBitmap(bitmap);
        }else {
            Toast.makeText(this, "SD卡不存在或不可用", Toast.LENGTH_LONG).show();
        }
    }
    private Bitmap getScaleBitmap(String path) {
        Bitmap bitmap = null;
        try {
            ExifInterface exifInterface = new ExifInterface(path);
            imageWidth = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0);
            imageHeight = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0);
            int scaleX = (int) (imageWidth*0.1f/screenWidth + 0.5f); //加0.5f是为了四舍五入
            int scaleY = (int) (imageHeight*0.1f/screenHeight + 0.5f);
            int scale = (int)( Math.sqrt(scaleX*scaleX + scaleY*scaleY) + 0.5f);
            Options options = new Options();
            //设置图片的采样率
            options.inSampleSize = scale;  //假设为4,表示原来宽高的1/4,原来为2560*1600变成了640*400
            bitmap = BitmapFactory.decodeFile(path, options);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }
// 获取Android屏幕的信息
    private void getScreenWith() {
        //三种方式
        //第一种
// WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// width = windowManager.getDefaultDisplay().getWidth();
// height = windowManager.getDefaultDisplay().getHeight();
        //第二种
// Point point = new Point();
// WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
// windowManager.getDefaultDisplay().getSize(point);
// width = point.x;
// height = point.y;
        //第三种
        DisplayMetrics metric = new DisplayMetrics(); 
        getWindowManager().getDefaultDisplay().getMetrics(metric);
        screenWidth = metric.widthPixels;   //屏幕宽度
        screenHeight = metric.heightPixels;  //屏幕高度
    }
}

结果:

这里写图片描述

© 著作权归作者所有

共有 人打赏支持
Mr_Nice
粉丝 0
博文 47
码字总数 39947
作品 0
广州
腾讯X5WebView集成2018-05-15

工作中经常偶尔会用到H5网页来加载页面,使用原生的Android的WebView可以加载,但是当网页内容比较多的时候,需要等待很久才能加载完,加载完后用户才能看到网页中的内容,这样用户需要等很久...

林灬 ⋅ 05/15 ⋅ 0

Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho ⋅ 04/24 ⋅ 0

腾讯技术分享:Android版手机QQ的缓存监控与优化实践

本文内容整理自公众号腾讯Bugly,感谢原作者的分享。 1、问题背景 对于Android应用来说,内存向来是比较重要的性能指标。内存占用过高,会影响应用的流畅度,甚至引发OOM,非常影响用户体验。...

JackJiang2011 ⋅ 04/08 ⋅ 0

谷歌I/O大会8大看点:有Android系统全面更新

谷歌I/O大会8大看点:有Android系统全面更新 2018-05-08 10:27编辑: 枣泥布丁分类:业界动态来源:cnBate Android谷歌I/O大会 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师...

枣泥布丁 ⋅ 05/08 ⋅ 0

Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)

前言 在 开发中,性能优化策略十分重要 因为其决定了应用程序的开发质量:可用性、流畅性、稳定性等,是提高用户留存率的关键 本文全面讲解性能优化中的所有知识,献上一份 性能优化的详细攻...

Carson_Ho ⋅ 05/30 ⋅ 0

有道云笔记是如何使用TensorFlow Lite的?

文 / 有道技术团队 近年来,有道技术团队在移动端实时 AI 能力的研究上,做了很多探索及应用的工作。2017 年 11 月 Google 发布 TensorFlow Lite (TFLlite) 后,有道技术团队第一时间跟进 TF...

谷歌开发者 ⋅ 04/21 ⋅ 0

直播,音视频编码器和解码器(EasyDarwin)-Android

使用摄像头采集视频数据,并通过MediaCodec进行H264编码,之后打包成RTSP格式并上传的。 TextuewView也提供了一个setTransform方法,该方法接收一个matrix参数,使用该参数对当前的渲染内容进...

shareus ⋅ 05/18 ⋅ 0

张高兴的 Xamarin.Android 学习笔记:(一)环境配置

  最近在自学 Xamarin 和 Android ,同时发现国内在做 Xamarin 的不多。我在自学中间遇到了很多问题,而且百度到的很多教程也有些过时,现在打算写点东西稍微总结下,顺便帮后人指指路了。...

张高兴 ⋅ 2017/01/13 ⋅ 0

0-2岁的app开发人员必读,Android开发APP前的准备事项

随着移动互联网的兴起,各行各业对移动应用的需求越来越大,从事APP开发的人也越来越多,APP开发行业可以说是方兴未艾。APP开发是比较复杂的事情,涉及产品、美工设计、服务器端开发、Andro...

传授知识的天使 ⋅ 06/06 ⋅ 0

Android Hybrid开发:这是一份详细 & 全面的WebView学习攻略

前言 现在很多里都内置了Web网页(),比如说很多电商平台,淘宝、京东、聚划算等等,如下图 那么这种该如何实现呢?其实这是里一个叫组件实现 今天,我将献上一份全面 & 详细的 攻略,含具体...

Carson_Ho ⋅ 06/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

R计算IV

参考文章 #读取文件 rawdata = read.csv("/path/to/csv/file",header=T) colnames(rawdata)[18] <- "y" //重命名因变量y #数据分区 训练集测试集 trainIdx <- sample(nrow(rawdata), round(......

火力全開 ⋅ 11分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

阿里云云栖社区 ⋅ 11分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

猫耳m ⋅ 21分钟前 ⋅ 0

关于ireport自定义变量类型为list的时候

自己摸石头过河,我真的应该去趟市中心图书馆,借本真正靠谱的教材 网上的东西,只有0.01%是有用的,还有0.99%是垃圾,剩下的99%是垃圾的复制品。。 哎!~ 问题是这样的,报表带sql,从db中获...

炑炑milina ⋅ 22分钟前 ⋅ 0

Spring mvc ContextLoaderListener 原理解析

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。 <!-- 加载spring上下文信息,最主要的功能是解析applicationContex...

轨迹_ ⋅ 23分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云官方博客 ⋅ 24分钟前 ⋅ 0

Redis安装异常解决办法

官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxvf redis-2.8.17.tar.gz 3. 进入解压缩后的文件夹:c...

slagga ⋅ 29分钟前 ⋅ 0

006. 深入JVM学习—年轻代

1. 年轻代图片 年轻代(Young)属于JVM堆内存空间的一个组成部分 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区存在一段时间并且经过了...

影狼 ⋅ 30分钟前 ⋅ 0

如何成为一个合格的程序员

偶尔的,我会被人问道:如何成为一名优秀的程序员,更或者,如何成为一名程序员。每次人们问起,我都力图给出不同的答案。因此,我的答案是各种各样的。下面就是我认为的成为一名优秀的程序员...

柳猫 ⋅ 31分钟前 ⋅ 0

cups error_log日志暴增

日志内容 File \"/usr/lib/cups/notifier/dbus\" has insecure permissions 解决(未验证适用范围) sudo service cups stopsudo rm /etc/cups/subscriptions.conf*sudo rm -r /var/cac......

一介码夫_Hum ⋅ 34分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部