Android图像处理
相机的拍摄照片尺寸通常都很大,需要预先处理,然后才能在ImageView视图上显示。主流Android手机都带有800万像素的照相机组件。大尺寸的图片很容易耗尽应用的内存。因此,加载图片前,需要编写代码缩小图片。图片使用完毕,也需要编写代码清理删除它。
/**
* 图像处理
* @author mw
*
*/
public class PictureUtils {
/**
* 将图片缩放到设备默认的显示尺寸 onStart()调用
* @param a
* @param path
* @return
*/
public static BitmapDrawable getScaledDrawable(Activity a,String path){
Display display = a.getWindowManager().getDefaultDisplay();
float destWidth = display.getWidth();
float destHeight = display.getHeight();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path,options);
float srcWidth = options.outWidth;
float srcHeight = options.outHeight;
int inSampleSize = 1;
if (srcWidth > destWidth || srcHeight > destHeight) {
if (srcWidth > srcHeight) {
inSampleSize = Math.round(srcWidth/ destWidth);
}else{
inSampleSize = Math.round(srcHeight / destHeight);
}
}
options = new BitmapFactory.Options();
options.inSampleSize = inSampleSize;
Bitmap bitmap = BitmapFactory.decodeFile(path,options);
return new BitmapDrawable(a.getResources(),bitmap);
}
/**
* 缷载图片 onStop()调用
* @param imageView
*/
public static void cleanImageView(ImageView imageView){
if ( !(imageView.getDrawable() instanceof BitmapDrawable)) {
return;
}
BitmapDrawable b = (BitmapDrawable)imageView.getDrawable();
//释放bitmap占用的原始存储空间,避免可能的内存耗尽问题
b.getBitmap().recycle();
imageView.setImageDrawable(null);
}
}
//以下示例:加载图片---压缩图片---缩放图片---处理圆角
/**
* 根据传入的宽和高,计算出合适的inSampleSize值
* @param options
* @param reqWidth
* @param reqHeight
* @return
*/
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
if (width > height) {
inSampleSize = Math.round((float) width / (float) reqWidth);
}else {
//round 返回最接近参数,意思也就是四舍五入math.round(-8.1)=-8 math.round(8.9)=9
inSampleSize = Math.round((float) height / (float) reqHeight);
}
// 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
// 一定都会大于等于目标的宽和高。
//inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
/**
* 压缩好的bitmap
* @param pathName
* @param reqWidth
* @param reqHeight
* @return
*/
public static Bitmap decodeSampledBitmapFromResource(String pathName,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(pathName,options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth,reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
//options.inSampleSize = 5;
return BitmapFactory.decodeFile(pathName,options);
}
/**
* 处理圆角的图标
* @param background
* @param src
* @param r 弧度
* @param x
* @param y
* @return
*/
public static Bitmap mergerIcon(Bitmap background,Bitmap src,int r,int x,int y){
Bitmap output = Bitmap.createBitmap(background.getWidth(), background.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff000000;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, background.getWidth(), background.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = r;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(background, rect, rect, paint);
// canvas.drawBitmap(src, rect, rect, paint);
canvas.drawBitmap(src, x, y, paint);
canvas.save();
return output;
}
/**缩放图片*/
public static Bitmap resizeImage(Bitmap src, int destW, int destH){
if(src == null)return null;
int srcW = src.getWidth();
int srcH = src.getHeight();
float scaleWidth = 1;
float scaleHeight = 1;
if(srcW == destW&&srcH == destH){
return src;
}
//计算出这次要缩小的比例
scaleWidth=(float)destW/(float)srcW;
scaleHeight=(float)destH/(float)srcH;
//产生resize后的Bitmap对象
Matrix matrix=new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizeBmp=Bitmap.createBitmap(src, 0, 0, srcW, srcH, matrix, true);
return resizeBmp;
}
//示例使用
//获取图片路径
File fileDir = new File(SdcardUtil.getSdcardCollInfo() + str + "/" + pathList.get(0));
//处理图片
Bitmap bitmap = BitmapUtils.decodeSampledBitmapFromResource(fileDir.getPath(),200,700);
Bitmap background = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.intdex_page_cll_point);
//缩放图片
Bitmap map = BitmapUtils.resizeImage(bitmap, background.getWidth(), background.getWidth());
//处理圆角
image_Bitemap.setImageBitmap(BitmapUtils.mergerIcon(background, map, 7,0,0));
分享到:
相关推荐
eoeAndroid特刊第二期:Android图像处理篇 pdf,eoeAndroid策划的第二篇专题,主要整理和翻译在Android中进行图像处理的一些资源和文章,通过本专题内容的学习,您可以掌握如何在Android上对图片编程,主要包括但不...
一、Android图像处理基础 Android提供了丰富的API来处理图像,主要涉及以下几个库: 1. Android SDK的Bitmap类:Bitmap是Android系统中处理图像的基本类,包含了加载、绘制、裁剪、缩放和颜色操作等方法。 2. ...
本文将深入探讨Android图像处理的核心概念、关键API以及实用案例,帮助开发者掌握这一关键技术。 1. **Android图像基础** - Android支持多种图像格式,如JPEG、PNG、GIF和WEBP等。 - Bitmap类是Android中处理图像...
本文将深入探讨Android图像处理系统1.3的相关知识点,基于提供的链接(由于无法直接访问,以下内容将根据通常的Android图像处理知识进行阐述)。 1. **Android图像基础**: Android系统提供了多种图像处理API,...
一款Android下的图像处理软件,功能强大,最重要的是支持手写,笔画
Android图像处理系统1.0是专为这个操作系统设计的一套完整的图像管理和处理框架,旨在提供高效、灵活的图像操作功能。在这个系统中,开发者可以对图片进行各种操作,如裁剪、旋转、滤镜效果、色彩调整等,以满足不同...
这个名为"android_picture.zip"的压缩包可能包含了各种Android图像处理的示例代码,帮助开发者实现不同的图像特效。以下是一些Android图像处理的关键知识点: 1. **Bitmap类**:在Android中,Bitmap是用于表示图像...
在本讨论中,我们将深入探讨Android图像处理中的图形特效处理,主要围绕`AndroidMatrix`类,它是Android系统中用于执行2D图形变换的核心工具。 `AndroidMatrix`是Android SDK提供的一种机制,用于处理2D图形的矩阵...
总的来说,Android图像处理技术包括了基础API的使用、颜色空间转换、滤镜效果、几何变换以及第三方库的集成等多个方面。通过熟练掌握这些技术,开发者可以在Android平台上实现各种创意无限的图像处理功能,满足用户...
一、Android图像处理基础 在Android中,我们可以使用多种库来处理图像,例如Android自带的Bitmap类,它提供了基本的图像操作,如缩放、裁剪和颜色转换。此外,OpenCV是一个强大的开源计算机视觉库,包含许多高级图像...
1. **SurfaceTexture与OpenGL ES的集成**:Android图像处理系统常利用SurfaceTexture作为GPU渲染结果的接收者,并通过它可以将图像数据传递给其他组件,如VideoView或自定义的SurfaceHolder。在1.2版中,可能对这种...
基于OpenCV+JAVA+C++的Android图像处理工具软件+源码+开发文档说明+实用教程,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于OpenCV+JAVA+C++的Android图像...
综上所述,Android图像处理涵盖了从基础的图像加载、显示到复杂的计算机视觉应用,涉及到多个类和库。开发者需要理解每个工具的作用,灵活运用以满足不同的需求,同时注重性能优化,确保应用的稳定性和效率。通过...
基于OpenCV+JAVA+C++的Android图像处理工具软件+源码+开发文档说明+实用教程(高分项目)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。包含:项目源码...
在这里,我们将详细探讨Android图像处理的一些关键知识点。 1. **Bitmap类**:Android中的Bitmap类是处理图像的基本工具,它代表了一个位图图像。理解Bitmap的内存管理至关重要,包括如何高效地加载、解码和复用...
一、Android图像处理 1. 图像加载库:Android原生的Bitmap API虽然可以处理图像,但在性能和内存管理上存在不足。因此,开发者常使用如Glide、Picasso、Fresco等第三方库来优化图像加载,它们能实现缓存机制,避免...
总的来说,Android图像处理涉及到的知识点广泛且深入,包括但不限于Matrix的几何变换、BitmapMesh的像素操作、Canvas与Paint的基础绘图以及可能需要的OpenGL ES编程。熟练掌握这些技术,可以帮助开发者创造出更加...
本文将深入探讨“Android图像处理之画笔特效处理”这一主题,通过一个具体的demo来展示如何在Android应用程序中实现各种有趣的画笔特效。 首先,Android的Canvas类是图像绘制的核心,它提供了丰富的绘图方法,如...
### 基于OpenCV的Android图像处理(Eclipse与NDK)环境搭建详解 #### 一、前言 在Android开发中,特别是在涉及到图像处理的应用场景时,使用OpenCV库能够极大地提升图像处理能力。本文将详细介绍如何在Eclipse环境...