1、环境
在手机SD卡上有一张图片,图上相对较大,如果直接用读取文件的方式将图片读取出来有可能会出现内存益处,这里就必须要将图片压缩读取才能保证不出现内存益处错误
2、代码中需要用到的类方法及其主要作用
2.1 Environment:主要是用于获取SD卡的路径信息
2.2 AsyncTask:异步任务,用于耗时操作实现异步功能
2.3 doInBackground(),AsyncTask子类的实现方法,该方法运行在工作线程上,主要用于执行一些耗时操作。
2.4 onPostExecute() AsyncTask子类的实现方法,该方法运行在主线程上,主要用于更新UI操作。
2.5 Options 通过此类封装一些压缩的配置信息
2.6 opts.inJustDecodeBounds 通过该属性的设置BitmapFactory.decodeFile()只读取图片的边界信息(长和宽并将读取到的边界信息存入Options对象中
2.7 BitmapFactory 读取图片信息封装类
2.8 DisplayMetrics 获取屏幕信息
3.代码实现
package com.example.compressedimage;
import java.io.File;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.util.DisplayMetrics;
import android.widget.ImageView;
public class MainActivity extends Activity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.imageView1);
/**取得SD卡存储图片的路径*/
File fileDir = Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
/**创建图片文件*/
File file = new File(fileDir, "wf.jpg");
ImageTask iTask = new ImageTask();
/**从线程池THREAD_POOL_EXECUTOR获取线程执行异步操作*/
iTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, file);
}
/**
* 图片读取异步类,用于压缩图片及将图片更新到UI上
* @author Leiht
*/
class ImageTask extends AsyncTask<File, Void, Bitmap> {
/**此方法运行在工作线程上,通常用于执行耗时的操作(如读取较大的图片音乐文件等*/
@Override
protected Bitmap doInBackground(File... params) {
/**通过此类封装一些压缩的配置信息*/
Options opts = new Options();
/**通过该属性的设置使BitmapFactory.decodeFile()只读取图片的边界信息(长和宽
* 并将读取到的边界信息存入Options对象中*/
opts.inJustDecodeBounds = true;
/**开始读取指定图片的边界信息*/
BitmapFactory.decodeFile(params[0].getPath(), opts);
/**获取图片的边界信息*/
int weight = opts.outWidth;
int height = opts.outHeight;
/**获取屏幕信息*/
DisplayMetrics dm = new DisplayMetrics();
/**将window窗口的显示信息封装到DisplayMetrics对象*/
getWindowManager().getDefaultDisplay().getMetrics(dm);
/**节能屏幕的宽度和高度(以象素为单位)*/
int dp = dm.widthPixels;
int hp = dm.heightPixels;
/**设置压缩比例,压缩比例算法自己确定*/
int x = weight/dp;
int y = height/hp;
if(x >= y && x > 1) {
opts.inSampleSize = x;
}else if(y > x && y > 1) {
opts.inSampleSize = y;
}else {
//默认取8
opts.inSampleSize = 8;
}
/**通过该属性的设置使BitmapFactory.decodeFile()以字节的方式读取图片*/
opts.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(params[0].getPath(), opts);
return bitmap;
}
/**
* 此方法在主线程中执行,用于更新UI界面
*/
@Override
protected void onPostExecute(Bitmap result) {
/**显示图片到ImageView*/
iv.setImageBitmap(result);
}
}
}
分享到:
相关推荐
即使图片尺寸符合要求,我们也可以进一步压缩图片,比如通过降低JPEG的质量来减小文件大小。这可以通过设置BitmapFactory.Options的inQuality属性来实现: ```java options.inPreferredConfig = Bitmap.Config.RGB_...
本教程将深入探讨如何通过质量压缩、尺寸压缩、采样率压缩和转换为RGB565格式来实现Android图片的高效压缩。这四种方法可以帮助开发者优化应用性能,减少内存占用,并提高用户体验。 1. **质量压缩**: 质量压缩是...
本Demo专注于演示如何在Android平台上实现在应用内选择本地图片或通过相机拍摄新照片后进行上传的操作。以下将详细解析这一过程涉及的关键知识点。 1. **图片选择** - **Intent选择器**:在Android中,可以通过...
本项目"android图片裁剪demo"提供了一个方便、实用的解决方案,它是一个专门用于图片裁剪的工具类,旨在帮助开发者轻松实现这一功能。项目内包含了一个sample应用,可以直观展示如何使用这个工具类,同时也解决了...
在实际项目中,还需要考虑性能优化,例如使用`Glide`或`Picaso`等库加载图片以减少内存消耗,以及在上传前压缩图片大小以减少网络传输时间。在`UpLoadPic`这个压缩包文件中,可能包含了实现这些功能的相关代码示例,...
"android图片处理集合demo"是一个示例项目,集中展示了多种图片处理技术。虽然代码可能没有经过精心整理,但仍然能为开发者提供宝贵的参考。 1. 图片加载库: Android原生的Bitmap API在处理大量或大尺寸图片时...
本项目“Android大图片缓存技术Demo”旨在演示如何有效解决这个问题,通过运用图片压缩技术和缓存策略,确保应用能够流畅地加载大量图片而不会引发性能问题。 首先,我们要理解Android中的内存管理机制。Android...
"android异步加载图片Demo"是一个示例项目,它演示了如何利用Android的`AsyncTask`来解决这个问题。`AsyncTask`是Android提供的一种轻量级的异步处理机制,用于在后台线程执行耗时操作,然后在UI线程更新结果,以...
在Android开发中,图片...总的来说,这个"android图片上传demo"覆盖了Android客户端的图片选取、压缩、网络请求,以及服务端的文件接收、存储和响应。对于想要掌握这一技术的开发者,这是一个非常有价值的实践案例。
以上就是"android上传图片Demo"的核心内容,它覆盖了从权限获取、图片选择、压缩、网络上传到错误处理等多个关键步骤,是学习Android图片上传功能的实用教程。在实际应用中,你可以根据需求进行扩展和优化,比如添加...
这个"Android拍照选择图片Demo"就是一个实例,展示了如何在Android应用中集成这两个功能。以下将详细介绍这两个功能的实现步骤及相关的技术点。 1. **启动相机拍照** 在Android中,启动相机通常通过`Intent`来...
3. **保存压缩图片**:使用`FileOutputStream`将压缩后的Bitmap写入文件,通常会指定新的文件路径和格式。 在实际应用中,我们还需要考虑如何在PopupWindow中展示图片选择功能。PopupWindow是Android提供的一种轻量...
综上所述,"Android瀑布流demo"项目涵盖了Android自定义布局、数据适配、图片加载、滚动监听、无限滚动等多个技术点,通过学习和实践这个demo,开发者可以掌握构建高效、美观的瀑布流界面的技能。
源于CameraKit-Android和compressor的android拍照录像demo,含有拍照,压缩,录像,照明,闪光灯,摄像头切换,图片质量切换等功能,可以在项目中直接使用。博客地址:...
"Android最新平台上可运行的Android demo"是一个绝佳的学习资源,它提供了完整的Android平台实例,旨在帮助开发者通过实际操作来深入理解Android开发。这个压缩包包含了多个核心文件,每个都有其特定的功能和重要性...
这个"android HttpURLConnection上传图片demo"提供了一个具体的示例,教我们如何使用HttpURLConnection来完成这一任务。HttpURLConnection是Java标准库中的一个类,它允许Android应用程序与HTTP服务器进行通信,执行...
目前一般手机的相机都能达到800万像素,像我的Galaxy Nexus才500万像素,拍摄的照片也有1.5M左右。这么大的照片上传到服务器,不仅浪费流量,同时还... 此demo 解决了Android压缩图片到100K以下并保持不失真的高效方法
本文将深入探讨如何创建一个Android启动页,解决图片被拉伸和压缩的问题,以及如何适配虚拟导航栏。 首先,我们需要了解启动页的基本结构。一个简单的启动页通常由一个SplashActivity组成,该Activity会在应用启动...