zoukankan      html  css  js  c++  java
  • Android 获得图片并解码成缩略图以减少内存消耗

    本文内容

    • 环境
    • 演示

    下载 Demo

    环境


    • Windows 2008 R2 64 位
    • Eclipse ADT V22.6.2,Android 4.4.3
    • SAMSUNG GT-I9008L,Android OS 2.2.2

    演示


    缩略图能减少手机内存的消耗。网络上的资源一般对手机来说,大了点,把图片解码,减少其尺寸,从而减少手机内存的消耗。

    本文采用的歌曲列表是 Android_Music_Demo_json_h_array.xml 文件,虽然文件后缀名是 .xml,但内部其实是 JSON 格式,因为 cnblog 不让上传 .json 格式的文件,该文件里的缩略图都较大,是 .jpg 格式,而与之对应的 Android_Music_Demo_json_array.xml 文件里的缩略图,都很小,都是才不到10k的 .png 格式。

    device-2014-07-10-151737

    图 1

    假设给定一个图片链接地址,想获得图片缩略图,核心代码如下所示,点击此处下载:

    private Bitmap getBitmap(String url) {
            File f = fileCache.getFile(url);
     
            // from SD cache
            Bitmap b = decodeFile(f);
            if (b != null)
                return b;
     
            // from web
            try {
                Bitmap bitmap = null;
                URL imageUrl = new URL(url);
                HttpURLConnection conn = (HttpURLConnection) imageUrl
                        .openConnection();
     
                conn.setRequestMethod("GET");
                // Sets the flag indicating whether this URLConnection allows input.
                // conn.setDoInput(true);
                conn.setConnectTimeout(3000);
                conn.setReadTimeout(3000);
                // Flag to define whether the protocol will automatically follow
                // redirects or not.
                conn.setInstanceFollowRedirects(true);
                int response_code = conn.getResponseCode();
                if (response_code == 200) {
                    InputStream is = conn.getInputStream();
                    OutputStream os = new FileOutputStream(f);
                    StreamUtils.CopyStream(is, os);
                    os.close();
                    conn.disconnect();
                    bitmap = decodeFile(f);
                    return bitmap;
                } else {
                    conn.disconnect();
                    return null;
                }
     
            } catch (Throwable ex) {
                ex.printStackTrace();
                if (ex instanceof OutOfMemoryError)
                    memoryCache.clear();
                return null;
            }
        }
    private Bitmap decodeFile(File f) {
            try {
                // decode image size
                BitmapFactory.Options o = new BitmapFactory.Options();
                o.inJustDecodeBounds = true;
                FileInputStream stream1 = new FileInputStream(f);
                BitmapFactory.decodeStream(stream1, null, o);
                stream1.close();
     
                // Find the correct scale value. It should be the power of 2.
                final int REQUIRED_SIZE = 70;
                int width_tmp = o.outWidth, height_tmp = o.outHeight;
                int scale = 1;
                while (true) {
                    if (width_tmp / 2 < REQUIRED_SIZE
                            || height_tmp / 2 < REQUIRED_SIZE)
                        break;
                    width_tmp /= 2;
                    height_tmp /= 2;
                    scale *= 2;
                }
     
                // decode with inSampleSize
                BitmapFactory.Options o2 = new BitmapFactory.Options();
                o2.inSampleSize = scale;
                FileInputStream stream2 = new FileInputStream(f);
                Bitmap bitmap = BitmapFactory.decodeStream(stream2, null, o2);
                stream2.close();
                return bitmap;
            } catch (FileNotFoundException e) {
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

    下载 Demo

  • 相关阅读:
    链表逆序输出 ---九度1511
    java 通过ssh连接linux服务器的测试代码
    C/C++时间函数总结
    C,C++,windows api, linux api 操作文件总结
    基于大数据计算思想的分布式数据库
    手机定位的方式
    矩阵取数问题
    回文字符串
    linux shell重定向总结
    apache flink 入门
  • 原文地址:https://www.cnblogs.com/liuning8023/p/3835846.html
Copyright © 2011-2022 走看看