`
z303729470
  • 浏览: 134069 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android对图片的压缩读取和保存

 
阅读更多
在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

  然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?

  经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的

  If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.

  意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。
具体代码如下:
FrameLayout fr=(FrameLayout)findViewById(R.id.FrameLayout01);
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", options); //此时返回bm为空
        options.inJustDecodeBounds = false;
         //缩放比
        int be = (int)(options.outHeight / (float)200);
        if (be <= 0)
            be = 1;
        options.inSampleSize = be;
        //重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false哦
        bitmap=BitmapFactory.decodeFile("/sdcard/test.jpg",options);
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        System.out.println(w+"   "+h);
        ImageView iv=new ImageView(this);
        iv.setImageBitmap(bitmap);

这样我们就可以读取较大的图片而不会内存溢出了。如果你想把压缩后的图片保存在Sdcard上的话就很简单了:
File file=new File("/sdcard/feng.png");
        try {
            FileOutputStream out=new FileOutputStream(file);
            if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){
                out.flush();
                out.close();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
ok,这样就把图片保存在/sdcard/feng.png这个文件里面了,呵呵。
但是这里的缩放保存是按长宽比例的,下边也可以按固定大小缩放哦:
        int bmpWidth  = bitmap.getWidth(); 
        int bmpHeight = bitmap.getHeight(); 
         
        //缩放图片的尺寸 
        float scaleWidth  = (float) sWidth / bmpWidth;     //按固定大小缩放  sWidth 写多大就多大
        float scaleHeight = (float) sHeight / bmpHeight;  //
        Matrix matrix = new Matrix(); 
        matrix.postScale(scaleWidth, scaleHeight); 
         
        //产生缩放后的Bitmap对象 
        Bitmap resizeBitmap = Bitmap.createBitmap( 
            bitmap, 0, 0, bmpWidth, bmpHeight, matrix, false); 
        bitmap.recycle(); 
                Bitmap resizeBitmap = bitmap; 
        //Bitmap to byte[] 
        byte[] photoData = bitmap2Bytes(resizeBitmap); 
       
        //save file 
        String fileName = "/sdcard/test.jpg"; 
        FileUtil.writeToFile(fileName, photoData); 
分享到:
评论

相关推荐

    Android图片质量压缩

    在Android开发中,图片处理是一项常见且重要的任务,特别是在上传图片到服务器或者在移动设备上存储和显示时,为了节省存储空间和网络传输时间,通常需要对图片进行压缩。本篇将详细介绍Android平台上的图片质量压缩...

    Android图片压缩源代码

    总之,这个"Android图片压缩源代码"Demo涵盖了Android图片压缩的核心技术,包括读取、压缩和保存图片,以及在PopupWindow中实现图片选择和预览功能。通过学习和实践,开发者能够灵活地应用于自己的项目中,提升应用...

    android 图片压缩 demo

    本教程将探讨如何在Android中实现图片的压缩,特别是在一个名为"picture-compress-m552-master"的项目中,该项目提供了高度自定义的图片压缩功能,能够将图片压缩至200h*200w的尺寸。 首先,我们要了解Android中...

    Android中图片处理(压缩 显示 保存)

    在Android开发中,图片处理是一项常见且重要的任务,涉及到图片的压缩、显示和保存等多个方面。本文将基于给定的代码片段,深入探讨在Android中如何有效地进行图片处理。 ### 图片压缩 图片压缩主要目的是减少图片...

    android开发图片压缩

    1. **选择压缩库**:在Android开发中,有许多优秀的开源库可以帮助我们进行图片压缩,如 Glide、Picasso 和 Fresco。这些库不仅支持图片加载,还提供了图片压缩的功能。本示例中可能使用的是名为“Compressor”的库...

    Android图片压缩示例

    在Android开发中,图片压缩是一项常见的任务,尤其在优化应用性能和减少数据传输时显得尤为重要。本示例主要探讨如何在Android中实现图片的压缩,包括压缩前后的效果对比以及在手机文件管理器中查看实际大小变化。...

    android图片压缩终极方案

    在Android开发中,图片压缩是一项常见的任务,尤其在移动设备资源有限的情况下,高效地处理图片以节省存储空间和提升应用性能至关重要。本项目名为“android图片压缩终极方案”,它利用了NDK(Native Development ...

    Android图片压缩(质量压缩和尺寸压缩)

    本文将详细讨论Android图片的两种主要压缩方式:质量压缩和尺寸压缩,以及这两种方法的原理和实现。 **质量压缩** 主要是通过降低图片的位深度、减少颜色数量来实现的。这种压缩方式不会改变图片的物理尺寸(宽度和...

    图片异步压缩保存到本地文件

    异步处理是Android开发中的最佳实践,特别是处理资源密集型任务,如图片压缩和保存。这是因为这些操作如果在主线程中执行,可能会阻塞UI,使应用变得无响应。Android 提供了 AsyncTask、Handler/Looper、...

    xe7android-保存图片

    在Android开发中,保存和处理图片是常见的任务之一。`xe7android-保存图片`这个主题主要涵盖了如何在Android应用中截取、读取以及保存BMP(Bitmap)格式的图片。下面我们将深入探讨这些知识点。 一、Android截图 1....

    android从网络,SD卡获取图片,压缩后显示到界面,可以保存到本地

    总结来说,从网络获取图片,需要处理网络请求和图片加载;从SD卡获取图片,主要涉及文件操作。图片的压缩和显示则需要掌握Bitmap的相关API,包括尺寸调整和质量压缩。最后,保存图片到本地需要注意选择合适的压缩...

    Android 图片压缩不OOM,超高保真度

    通过缓存机制,我们可以将处理过的图片保存在内存或磁盘,下次再需要时直接读取,从而提高性能并减轻内存压力。 在实际项目中,` Glide`、`Picasso` 或 `Fresco` 这样的第三方库提供了一套完整的图片加载、缓存和...

    Android相机、相册获取图片显示和保存

    demo为仿微信朋友圈发动态的功能,实现从相机拍照和相册(相册为自己实现且支持同时选取多张图片)选取图片显示和删除并保存到本地SD卡操作(保存到本地的是高清的压缩图片小于100KB 分辨率1280*720 可以直接上传到...

    鲁班Luban压缩图片(仿微信朋友圈压缩图片)

    鲁班Luban是一款在Android Studio环境中开发的图片压缩库,其主要功能是仿照微信朋友圈的图片压缩机制,能够高效地对图片进行压缩处理,以适应移动应用中对图片大小的严格控制需求。该库由Java 1.8编写,因此在使用...

    android安卓app图片压缩技术,一张将近3M的图片经过压缩后容量减小到186K,压缩效率达到16倍.zip

    7. **利用Content Provider和URI**:在处理图片时,可以直接通过ContentResolver获取Bitmap,避免先将图片保存到本地再读取,减少中间步骤。 8. **使用Glide或Picasso库**:这些流行的图片加载库提供了自动压缩和...

    Android相机、相册获取图片显示并保存源码

    8. **处理URI权限问题**:Android Q(API 29)之后,对存储权限进行了限制,获取到的图片URI可能只对特定应用有效。此时,需要使用`grantUriPermission()`方法将权限授予自己的应用,或者通过`DocumentsContract`...

    Luban Android图片压缩工具,仿微信朋友圈压缩策略。

    Luban是一款专门为Android平台设计的图片压缩工具库,其主要功能是模仿微信朋友圈的图片压缩策略,以实现高效、高质量的图片压缩效果。这款开源工具由Curzibn开发,并在GitHub上发布,项目名为Luban-master。在原版...

    图片上传及压缩类

    上传类 android."中,我们可以提取出两个主要知识点:图片压缩和图片上传。 首先,我们来看图片压缩。在Android中,由于内存限制和网络传输速度的考虑,通常需要对图片进行压缩以减小其大小。`PictureUtils.java`...

    Android下的图片压缩及图片和视频的上传

    3. **计算缩放比例**:根据目标尺寸和图片原始尺寸计算缩放比例,避免内存溢出。公式一般为:inSampleSize = Math.max(widthTarget / widthOriginal, heightTarget / heightOriginal)。 4. **压缩图片**:再次调用...

Global site tag (gtag.js) - Google Analytics