Android Sqlite存取图片及转换缩略图

  本来打算用数据库sqlite存取图片(图片都是相机拍摄的原图),结果导致存入和读取的时候会消耗巨大内存,尤其是从数据库取图片时。所以准备存SDCard代替,但还是记录下如何用数据库存取图片以及转换成缩略图。

  表结构一个String和一个Blob。bitmap不能直接存数据库,用BLOB (binary large object)二进制大对象。

String sql = "create table team (name varchar(20) primary key, image blob);";

  bitmap先要转换成二进制数组。

public byte[] img(Bitmap bitmap) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
        return baos.toByteArray();
    }

  插入数据库。(person.getImage()就是一个bitmap)

public void insert(Person person) {
        SQLiteDatabase db = openHelper.getWritableDatabase();
        if (db.isOpen()) {
            db.execSQL("insert into team(name,image) values (?, ?);",
                    new Object[]{person.getName(), img(person.getImage())});
            db.close();
        }
    }

  接下来取图片和转换成缩略图。

  BitmapFactory.decodeByteArray(in, 0, in.length)可以把取出来的二进制数组in转换成bitmap。

  BitmapFactory.Options options = new BitmapFactory.Options();  //解析位图的附加条件

  options.inJustDecodeBounds = true;  //inJustDecodeBounds设为true,不去解析真实的位图,读取头文件获取基本信息

  options.inSampleSize  //位图缩放比例,好像实际取值只能是2的幂次方(15取8,17取16,未考证)

  最后inJustDecodeBounds = false,接下来就加载缩略图。

public ArrayList<Person> queryAll() {
        SQLiteDatabase db = openHelper.getReadableDatabase();
        if (db.isOpen()) {
            Cursor cursor = db.rawQuery("select * from team;", null);
            if (cursor != null && cursor.getCount() > 0) {
                ArrayList<Person> teamList = new ArrayList<Person>();
                String name;
                Bitmap image;
                while (cursor.moveToNext()) {
                    name = cursor.getString(0);
                    byte[] in = cursor.getBlob(1);
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inJustDecodeBounds = true;
                    image = BitmapFactory.decodeByteArray(in, 0, in.length, options);
                    int bitmapWidth = options.outWidth;
                    int bitmapHeight = options.outHeight;
                    int x = 180;
                    int dx = bitmapWidth / x;
                    int dy = bitmapHeight / x;
                    if (dx > dy && dy > 1) {
                        options.inSampleSize = dx;
                    }
                    if (dy > dx && dx > 1) {
                        options.inSampleSize = dy;
                    }
                    options.inJustDecodeBounds = false;
                    image = BitmapFactory.decodeByteArray(in, 0, in.length, options);
                    teamList.add(new Person(name, image));
                }
                db.close();
                return teamList;
            }
            db.close();
            return null;
        }
        return null;
    }
时间: 2024-10-09 06:00:56

Android Sqlite存取图片及转换缩略图的相关文章

Android图片圆角转换 RoundedImageView开源项目 小记

Android 将图片快速转换成圆角的方法 使用开源项目  RoundedImageView github上面的开源项目 官方地址为:   https://github.com/vinc3m1/RoundedImageView 效果如下:     下面快速的集成进来 步骤分为3个 1: 去github上下载 工程 https://github.com/vinc3m1/RoundedImageView 2: 导入工程 3  在布局中使用它 <com.makeramen.rounded.Rounde

SharedPreferences详解(三)——存取图片

MainActivity如下: 1 package cc.sp; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import android.os.Bundle; 6 import android.util.Base64; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 impo

BitmapFactory.Options解决Android加载图片内存溢出的问题

BitmapFactory.Options解决Android加载图片内存溢出的问题 1. 在Android软件开发过程中,图片处理是经常遇到的. 在将图片转换成Bitmap的时候,由于图片的大小不一样,当遇到很大的图片的时候会出现超出内存的问题,为了解决这个问题Android API提供了BitmapFactory.Options这个类. 2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出.Bitmap会将图片的所有像素(即长x宽)加载到内存中,如果图片分辨率过大,会直

Android常用的图片加载库

 Android常用的图片加载库 前言:图片加载涉及到图片的缓存.图片的处理.图片的显示等.四种常用的图片加载框架,分别是Fresco.ImageLoader. Picasso. Glide. Universal Image Loader:ImageLoader是比较老的框架,一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛. ImageLoader开源库存哪些特征: 1.多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 2.支持随意的

【原创】android——SQLite实现简单的注册登陆(已经美化)

1,Main_activity的xmL配置 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_pa

Android+Sqlite 实现古诗阅读应用(三)

往期传送门: Android+Sqlite 实现古诗阅读应用(一) Android+Sqlite 实现古诗阅读应用(二) 加入截图分享的功能. 很多应用都有分享的功能,我也想在我的古诗App里加入这个功能,单纯的发送文字看起来太逊了,我决定模仿UC浏览器那样发送古诗的截图,使用官方的分享需要授权KEY,太过麻烦所以打算使用系统的分享. 1.在meau里添加这个item: 1 <item 2 android:id="@+id/menu_item_share" 3 android:s

Android+Sqlite 实现古诗阅读应用(二)

传送门:Android+Sqlite 实现古诗阅读应用(一):http://www.cnblogs.com/lfk-dsk/p/4492974.html Hi,又回来了,最近接到很多热情洋溢的小伙伴们的来信,吼开心哈,我会继续努力的=-=! 上回的东西我们做到了有个textview能随机选择诗来进行显示,这也是我做这个东西的初衷,我想找我到底有哪些古诗没有读过,更想感受一下风吹哪页看哪页的闲适(扯远了=-=!),所以功能现在差不多算是结束了, 不过一个古诗应用这么丑可不行,还有就是,我找到了我要

Android SQLite总结(一)

前言 对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取.下面就向大家介绍一下SQLite常用的操作方法.本篇文章主要用到SQLiteDatabase的一些函数.废话少说,直接贴代码!由于数据库中操作的对象时Student类,因此我们看一下Student.java代码: [java]   view plain copy <EMBED id=ZeroClipboardMovie_1 name=ZeroClipboardMovie_1 ty

分享Android NDK技术详解及应用(Android加壳图片处理性能优化)

1.课程研发环境案例源代码编译和运行环境以JDK1.7和android-sdk-23以及android-ndk-10e版本为基准, ,以下环境都适用于项目.开发工具:android studio 1.5正式版, QT 5.0,SourceInsight 3.5;其他工具:使用到了IDEA PRO工具以及www.androidxref.com网站查看分析源码.2.内容简介本课程主要讲解NDK技术的基本使用方法,如基本常用的JNI函数.Android系统中能使用的本地库的使用方法和注意事项以及GCC