Android应用开发之图片(Bitmap)压缩(三)---------采样率压缩
2014-10-31 18:25
537 查看
博客为 有时个哥 原创,如需转载请标明出处:/article/11171954.html
采样率压缩:
采样率压缩是改变了图片的像素,他是通过先读取图片的边,然后在自己设定图片的边,然后根据设定,读取图片的像素。在读取的时候,并不是所有的像素都读取,而是由选择的。所以这种方式减少了像素的个数,能改变图片在内存中的占用大小。大体的用法如下面。我们用下面的简单实例代码来了解一下。
然后下面是运行结果:
由运行结果我们可以看出前后的bitmap呗压缩了4倍。关于ImageUtils3中的BitmapFactory里面的一些方法的作用已经在Android应用开发之图片(Bitmap)压缩(一)中介绍过了。
options.inJustDecodeBounds = true;这一句话是允许读取图片的边,然后读取Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);图片,把图片的信息存入到了上面BitmapFactory.Options options = new BitmapFactory.Options();的options里面了。值得注意的是,当options.inJustDecodeBounds 的值是true,只是读取图片的边,而不是读取整个图片,所以Bitmap
bitmap = BitmapFactory.decodeFile(imagePath,options);得到的bitmap是空的。获得图片的信息后,接下来为了能保证获得正常的bitmap,所以要关闭 options.inJustDecodeBounds ,即把他的值变为false;然后我们在根据自己的需求设置图片的大小。options.inSampleSize 这个参数就是来设置图片的压缩倍数,我这里测试时写的值是2,也就是说是原来的1/2,要注意,这里的1/2值得是宽和高分别是原图的1/2。所以图片是被压缩了四倍,从输出的结果我们也能看出。这里也可以通过options得到图片的高和宽,用高宽,来设定压缩的倍数。设置好压缩的倍数,则在运行Bitmap
bitmap = BitmapFactory.decodeFile(imagePath,options);获得bitmap。由于此时options.inJustDecodeBounds = false,所以是得到的bitmap不是空了,此时得到是已经压缩好的bitmap。
采样率压缩,的的确确的改变了图片占用内存问题,但是由于像素改变,压缩容易造成失真问题。使用采样率压缩,不需要一开始把图片完全读取到内存,而是先读取图片的边,然后设置图片的尺寸,然后再根据尺寸,选择的读取像素。这种方法避免了一开始就吧图片读入内存而造成的oom异常。
采样率压缩:
采样率压缩是改变了图片的像素,他是通过先读取图片的边,然后在自己设定图片的边,然后根据设定,读取图片的像素。在读取的时候,并不是所有的像素都读取,而是由选择的。所以这种方式减少了像素的个数,能改变图片在内存中的占用大小。大体的用法如下面。我们用下面的简单实例代码来了解一下。
package com.example.bitmapdemo.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.text.TextUtils; public class ImageUtils3 { public static Bitmap compressImageToBitmap(String imagePath){ BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options); if(bitmap != null){ System.out.println("bitmap=========1>>>>"+bitmap.getByteCount()); }else{ System.out.println("kong"); } options.inJustDecodeBounds = false; options.inSampleSize = 2; bitmap = BitmapFactory.decodeFile(imagePath,options); System.out.println("bitmap=========2>>>>"+bitmap.getByteCount()); return bitmap; } }
package com.example.bitmapdemo; import java.io.FileInputStream; import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Environment; import com.example.bitmapdemo.utils.ImageUtils; import com.example.bitmapdemo.utils.ImageUtils2; import com.example.bitmapdemo.utils.ImageUtils3; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // String imagePath = "/mnt/sdcard/image.png"; String imagePath = "/mnt/sdcard/17.jpg"; Bitmap bitmap = getBitmap(imagePath); getInputStreanm(imagePath); // getCompessImage(imagePath); getCompessImage(bitmap); // getCompess(imagePath); } public Bitmap getBitmap(String pathName){ Bitmap bm = ImageUtils.getBitmapFromLocal(pathName); // Bitmap bm = ImageUtils2.getBitmapFromLocal(pathName); // System.out.println("bitmap:::"+bm.getRowBytes()*bm.getHeight()); System.out.println("bitmap:::"+bm.getByteCount()); System.out.println("bitmap的另一种求法:::"+bm.getWidth() * bm.getHeight()*4 ); return bm; } public void getInputStreanm(String pathName){ try { FileInputStream fis = new FileInputStream(pathName); System.out.println("inputStream:::"+fis.available()); } catch (Exception e) { e.printStackTrace(); } } public void getCompess(String pathName){ ImageUtils2.writeCompressImage2File(pathName,Environment.getExternalStorageDirectory() .getAbsolutePath()+"/oo", 60); } public void getCompessImage(String pathName){ ImageUtils3.compressImageToBitmap(pathName); } public void getCompessImage(Bitmap bitmap){ ImageUtils3.compressImageToBitmap(bitmap); } }
然后下面是运行结果:
由运行结果我们可以看出前后的bitmap呗压缩了4倍。关于ImageUtils3中的BitmapFactory里面的一些方法的作用已经在Android应用开发之图片(Bitmap)压缩(一)中介绍过了。
options.inJustDecodeBounds = true;这一句话是允许读取图片的边,然后读取Bitmap bitmap = BitmapFactory.decodeFile(imagePath,options);图片,把图片的信息存入到了上面BitmapFactory.Options options = new BitmapFactory.Options();的options里面了。值得注意的是,当options.inJustDecodeBounds 的值是true,只是读取图片的边,而不是读取整个图片,所以Bitmap
bitmap = BitmapFactory.decodeFile(imagePath,options);得到的bitmap是空的。获得图片的信息后,接下来为了能保证获得正常的bitmap,所以要关闭 options.inJustDecodeBounds ,即把他的值变为false;然后我们在根据自己的需求设置图片的大小。options.inSampleSize 这个参数就是来设置图片的压缩倍数,我这里测试时写的值是2,也就是说是原来的1/2,要注意,这里的1/2值得是宽和高分别是原图的1/2。所以图片是被压缩了四倍,从输出的结果我们也能看出。这里也可以通过options得到图片的高和宽,用高宽,来设定压缩的倍数。设置好压缩的倍数,则在运行Bitmap
bitmap = BitmapFactory.decodeFile(imagePath,options);获得bitmap。由于此时options.inJustDecodeBounds = false,所以是得到的bitmap不是空了,此时得到是已经压缩好的bitmap。
采样率压缩,的的确确的改变了图片占用内存问题,但是由于像素改变,压缩容易造成失真问题。使用采样率压缩,不需要一开始把图片完全读取到内存,而是先读取图片的边,然后设置图片的尺寸,然后再根据尺寸,选择的读取像素。这种方法避免了一开始就吧图片读入内存而造成的oom异常。
相关文章推荐
- Android应用开发之图片(Bitmap)压缩(三)---------采样率压缩
- Android应用开发之图片(Bitmap)压缩(一)---------Bitmap与BitmapFactory的认识及图片的存储形式大小的实验
- Android应用开发之图片(Bitmap)压缩(二)---------质量压缩
- Android应用开发中三种常见的图片压缩方法
- Android应用开发中三种常见的图片压缩方法
- Android应用开发中三种常见的图片压缩方法
- Android应用开发中三种常见的图片压缩方法
- Android应用开发中三种常见的图片压缩方法
- Android 应用开发笔记 - 切换图片(ImageSwitcher)
- Android 应用开发笔记 - 图片视图(ImageView)
- [Android算法] bitmap 将图片压缩到指定的大小
- Android BitmapFactory 图片压缩
- Android应用开发中图片的处理
- Android应用开发图片异步加载
- Android应用开发之BitmapFactory.Options详解
- Android应用开发之(图片处理技巧一)
- android开发对bitmap对象图片进行二值化处理算法
- Android图片 BitmapFactory.Options.inSampleSize 采样率不准确问题
- Android编程之Bitmap图片压缩大小
- Android应用开发之(利用好图片缓存)