博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android进阶2之图片缩略图(解决大图片溢出问题)
阅读量:4035 次
发布时间:2019-05-24

本文共 2493 字,大约阅读时间需要 8 分钟。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

正在做一个软件其中涉及到一些关于缩略图的知识。还有就是大图片的溢出问题,也可以通过缩略图的方式避免。

主要是通过BitmapFactory.Options 来实现。

Options中有个属性inJustDecodeBounds。我们可以充分利用它,来避免大图片的溢出问题。他是什么原理呢?

API这样说:如果该 值设为true那么将不返回实际的bitmap,也不给其分配内存空间这样就避免内存溢出了。但是允许我们查询图片的信息这其中就包括图片大小信息(

options.outHeight (图片原始高度)和option.outWidth(图片原始宽度))。

Options中有个属性inSampleSize。我们可以充分利用它,实现缩放。

如果被设置为一个值> 1,要求解码器解码出原始图像的一个子样本,返回一个较小的bitmap,以节省存储空间。

例如,inSampleSize = = 2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

对于任何值< = 1的同样处置为1。

那么相应的方法也就出来了,通过设置 inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),

然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。

实现步骤:

第一步:BitmapFactory.Option

设置 inJustDecodeBounds为true

第二步:BitmapFactory.decodeFile(path,option)方法

解码图片路径为一个位图。如果指定的文件名是空的,或者不能解码到一个位图,函数将返回null[空值]。

获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度)

第三步:计算缩放比例,也可以不计算,直接给它设定一个值。

options.inSampleSize = "你的缩放倍数";

如果是2就是高度和宽度都是原始的一半。

第四步:设置options.inJustDecodeBounds = false;

重新读出图片

bitmap = BitmapFactory.decodeFile(path, options);

具体实现:

package xiaosi.compress;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.widget.ImageView;public class Compress extends Activity{ /** Called when the activity is first created. */ private ImageView image = null; @Override public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.main);  image = (ImageView) findViewById(R.id.image);  image.setImageBitmap(decodeBitmap()); } public Bitmap decodeBitmap() {  BitmapFactory.Options options = new BitmapFactory.Options();  options.inJustDecodeBounds = true;  // 通过这个bitmap获取图片的宽和高         Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/MTXX/3.jpg", options);  if (bitmap == null)  {   System.out.println("bitmap为空");  }  float realWidth = options.outWidth;  float realHeight = options.outHeight;  System.out.println("真实图片高度:" + realHeight + "宽度:" + realWidth);  // 计算缩放比         int scale = (int) ((realHeight > realWidth ? realHeight : realWidth) / 100);  if (scale <= 0)  {   scale = 1;  }  options.inSampleSize = scale;  options.inJustDecodeBounds = false;  // 注意这次要把options.inJustDecodeBounds 设为 false,这次图片是要读取出来的。        bitmap = BitmapFactory.decodeFile("/sdcard/MTXX/3.jpg", options);  int w = bitmap.getWidth();  int h = bitmap.getHeight();  System.out.println("缩略图高度:" + h + "宽度:" + w);  return bitmap; }}

效果图:

一起见证菜鸟的起飞。。。。。。

           

给我老师的人工智能教程打call!

这里写图片描述
你可能感兴趣的文章
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
vsftp 配置具有匿名登录也有系统用户登录,系统用户有管理权限,匿名只有下载权限。
查看>>
linux安装usb wifi接收器
查看>>
补充自动屏蔽攻击ip
查看>>
谷歌走了
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>
关于对象赋值及返回临时对象过程中的构造与析构
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
SQL 多表联合查询
查看>>
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
C++中使用Mongo执行count和distinct运算
查看>>
一些socket的编程经验
查看>>