`

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));
 
 
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics