`

Android图像处理

阅读更多

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图像处理篇 pdf,eoeAndroid策划的第二篇专题,主要整理和翻译在Android中进行图像处理的一些资源和文章,通过本专题内容的学习,您可以掌握如何在Android上对图片编程,主要包括但不...

    Android图像处理技术(实现Android中的PS)(五)

    一、Android图像处理基础 Android提供了丰富的API来处理图像,主要涉及以下几个库: 1. Android SDK的Bitmap类:Bitmap是Android系统中处理图像的基本类,包含了加载、绘制、裁剪、缩放和颜色操作等方法。 2. ...

    Android图像处理技术

    本文将深入探讨Android图像处理的核心概念、关键API以及实用案例,帮助开发者掌握这一关键技术。 1. **Android图像基础** - Android支持多种图像格式,如JPEG、PNG、GIF和WEBP等。 - Bitmap类是Android中处理图像...

    android图像处理系统1.3

    本文将深入探讨Android图像处理系统1.3的相关知识点,基于提供的链接(由于无法直接访问,以下内容将根据通常的Android图像处理知识进行阐述)。 1. **Android图像基础**: Android系统提供了多种图像处理API,...

    Android图像处理软件

    一款Android下的图像处理软件,功能强大,最重要的是支持手写,笔画

    android图像处理系统1.0

    Android图像处理系统1.0是专为这个操作系统设计的一套完整的图像管理和处理框架,旨在提供高效、灵活的图像操作功能。在这个系统中,开发者可以对图片进行各种操作,如裁剪、旋转、滤镜效果、色彩调整等,以满足不同...

    android_picture.zip_Android图像处理_android

    这个名为"android_picture.zip"的压缩包可能包含了各种Android图像处理的示例代码,帮助开发者实现不同的图像特效。以下是一些Android图像处理的关键知识点: 1. **Bitmap类**:在Android中,Bitmap是用于表示图像...

    Android图像处理之图形特效处理

    在本讨论中,我们将深入探讨Android图像处理中的图形特效处理,主要围绕`AndroidMatrix`类,它是Android系统中用于执行2D图形变换的核心工具。 `AndroidMatrix`是Android SDK提供的一种机制,用于处理2D图形的矩阵...

    Android图像处理技术(实现Android中的PS)(六)

    总的来说,Android图像处理技术包括了基础API的使用、颜色空间转换、滤镜效果、几何变换以及第三方库的集成等多个方面。通过熟练掌握这些技术,开发者可以在Android平台上实现各种创意无限的图像处理功能,满足用户...

    Android图像处理技术(实现Android中的PS)(四)

    一、Android图像处理基础 在Android中,我们可以使用多种库来处理图像,例如Android自带的Bitmap类,它提供了基本的图像操作,如缩放、裁剪和颜色转换。此外,OpenCV是一个强大的开源计算机视觉库,包含许多高级图像...

    android图像处理系统框架1.2版

    1. **SurfaceTexture与OpenGL ES的集成**:Android图像处理系统常利用SurfaceTexture作为GPU渲染结果的接收者,并通过它可以将图像数据传递给其他组件,如VideoView或自定义的SurfaceHolder。在1.2版中,可能对这种...

    基于OpenCV+JAVA+C++的Android图像处理工具软件+源码+开发文档说明+实用教程(毕业设计&课程设计&项目开发)

    基于OpenCV+JAVA+C++的Android图像处理工具软件+源码+开发文档说明+实用教程,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于OpenCV+JAVA+C++的Android图像...

    eoeAndroid-about-image.zip_android_android 图像 处理

    综上所述,Android图像处理涵盖了从基础的图像加载、显示到复杂的计算机视觉应用,涉及到多个类和库。开发者需要理解每个工具的作用,灵活运用以满足不同的需求,同时注重性能优化,确保应用的稳定性和效率。通过...

    基于OpenCV+JAVA+C++的Android图像处理工具软件+源码+开发文档说明+实用教程(高分项目)

    基于OpenCV+JAVA+C++的Android图像处理工具软件+源码+开发文档说明+实用教程(高分项目)含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。包含:项目源码...

    安卓开发-Android 图像处理篇.zip

    在这里,我们将详细探讨Android图像处理的一些关键知识点。 1. **Bitmap类**:Android中的Bitmap类是处理图像的基本工具,它代表了一个位图图像。理解Bitmap的内存管理至关重要,包括如何高效地加载、解码和复用...

    Android图像处理与数据通信.zip

    一、Android图像处理 1. 图像加载库:Android原生的Bitmap API虽然可以处理图像,但在性能和内存管理上存在不足。因此,开发者常使用如Glide、Picasso、Fresco等第三方库来优化图像加载,它们能实现缓存机制,避免...

    Android绘图机制与处理技巧(三)——Android图像处理之图形特效处理

    总的来说,Android图像处理涉及到的知识点广泛且深入,包括但不限于Matrix的几何变换、BitmapMesh的像素操作、Canvas与Paint的基础绘图以及可能需要的OpenGL ES编程。熟练掌握这些技术,可以帮助开发者创造出更加...

    Android图像处理之画笔特效处理

    本文将深入探讨“Android图像处理之画笔特效处理”这一主题,通过一个具体的demo来展示如何在Android应用程序中实现各种有趣的画笔特效。 首先,Android的Canvas类是图像绘制的核心,它提供了丰富的绘图方法,如...

    基于Opencv的Android图像处理(Eclipse和ndk)环境搭建.docx

    ### 基于OpenCV的Android图像处理(Eclipse与NDK)环境搭建详解 #### 一、前言 在Android开发中,特别是在涉及到图像处理的应用场景时,使用OpenCV库能够极大地提升图像处理能力。本文将详细介绍如何在Eclipse环境...

Global site tag (gtag.js) - Google Analytics