Android图片处理:压缩、显示与保存实战
"Android中图片处理方法的实现,包括图片的压缩、显示和保存" 在Android应用开发中,处理图片是一项常见的任务,涉及到图片的压缩、显示以及保存等操作。以下是一些关键知识点: 1. 图片压缩: 在Android中,我们可以使用`BitmapFactory`类来解码图片并进行压缩。`BitmapFactory.decodeStream()`或`BitmapFactory.decodeFile()`方法可以用来从文件或流中加载图片。为了压缩图片,我们可以传递一个`BitmapFactory.Options`对象,设置其`inSampleSize`属性。这个值表示图像在解码时应缩小的倍数,从而降低图片的分辨率和大小,达到压缩的效果。 2. 显示图片: Android中的`ImageView`组件用于在界面上展示图片。通过调用`setImageBitmap(Bitmap bitmap)`方法,可以将压缩后的图片设置到`ImageView`上。此外,`Glide`或`Picasso`这样的库可以更高效地加载和显示图片,它们支持内存缓存和异步加载,能优化用户体验。 3. 图片保存: 保存图片通常涉及将`Bitmap`对象转换为字节数组,然后写入文件。`ByteArrayOutputStream`可以用于将`Bitmap`转换为字节数组,而`FileOutputStream`则用于将字节数组写入文件。例如,`Bitmap.compress(Bitmap.CompressFormat format, int quality, OutputStream stream)`方法可以压缩图片并将其写入指定的输出流。 4. ContentResolver和Uri: 在Android中,`ContentResolver`用于与内容提供者交互,获取或修改数据,如媒体库中的图片。`Uri`是统一资源标识符,可以指向各种类型的资源,如文件系统路径或内容提供者中的数据。在加载图片时,可以通过`ContentResolver`的`query()`方法,传入`Uri`和选择器,获取图片的元数据。 5. Cursor: 当查询`ContentResolver`时,返回的结果通常是一个`Cursor`对象,它像数据库的游标一样遍历结果集。在这个例子中,`Cursor`用于获取图片的本地路径。 6. Matrix和图像旋转: 如果需要对图片进行旋转,可以使用`Matrix`类。通过设置`Matrix.postRotate(float degrees)`,可以在现有位图的基础上旋转图片。这在处理用户拍摄的照片时特别有用,因为照片可能根据设备的方向被自动旋转。 7. 优化显示性能: 在加载大图时,为了避免内存溢出,可以使用`inJustDecodeBounds`选项先获取图片尺寸,然后计算合适的`inSampleSize`,确保加载的图片大小适合屏幕。 8. 异常处理: 在处理文件和I/O操作时,必须捕获并处理可能抛出的异常,如`FileNotFoundException`和`IOException`。 这些知识点是Android图片处理的基础,理解并熟练掌握它们可以帮助开发者有效地管理应用中的图片资源,提高应用性能和用户体验。
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import com.xikang.android.slimcoach.Conf;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Matrix;
import android.net.Uri;
import android.provider.MediaStore;
import android.util.FloatMath;
import android.util.Log;
import android.widget.ImageView;
import android.widget.Toast;
public class ImageUtils {
private static final String TAG = "ImageUtils";
public static void loadImage(Activity activity, ImageView imageView, Uri uri) {
if (Conf.INFO)
if (uri != null && !uri.toString().startsWith("content://")) {
return;
}
try {
// MediaStore
String[] pojo = { MediaStore.Images.Media.DATA };
Cursor cursor = activity.managedQuery(uri, pojo, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
ContentResolver cr = activity.getContentResolver();
int colunm_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
String path = cursor.getString(colunm_index);
if (Conf.INFO)
Log.i(TAG, "loadImage: path = " + path);
if (path.endsWith(".jpg") || path.endsWith(".png")) {
Bitmap bitmap = BitmapFactory.decodeStream(cr
.openInputStream(uri));
//imageView.setImageBitmap(getBitmap(path, 100, 200));
imageView.setImageBitmap(getCompredBitmap(path));
} else {
Toast.makeText(activity, "Please select image...",
Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
剩余8页未读,继续阅读
- 粉丝: 75
- 资源: 65
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦