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

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/liuning8023/p/3835846.html
Copyright © 2011-2022 走看看