图片的处理

我们在开发项目时经常会遇到图片的加载,这样我们就要对图片进行异步加载缓存。网上有很多开源框架,Picasso是Square公司开源的一个Android图形缓存库,可以实现图片下载和缓存。下载地址:http://square.github.io/picasso/,把下好的包加入到你工程的libs里就行了,Picasso使用很简单代码如下:

Picasso.with(context).load("URL").into(imageView);

ImageLoader也是开源的Android图形缓存库,它能对图片显示进行处理如圆角边框,圆形图片等。下载地址:https://github.com/nostra13/Android-Universal-Image-Loader,一样的把下好的包导入项目中去就行了。不做任何处理代码如下:

ImageLoader.getInstance().displayImage(url, ImageView);

把图片变成圆角矩形代码如下:

DisplayImageOptions  options = new DisplayImageOptions.Builder()
        .showStubImage(R.drawable.ic_stub)         加载开始默认的图片      
        .showImageForEmptyUri(R.drawable.ic_empty)     //url为空会显示该图片,自己放在drawable里面的
        .showImageOnFail(R.drawable.ic_error)                //加载图片出现问题,会显示该图片
        .cacheInMemory()                                               //缓存用
        .cacheOnDisc()                                                    //缓存用
        .displayer(new RoundedBitmapDisplayer(5))       //图片圆角显示,值为整数
        .build();

    ImageLoader.getInstance().displayImage(url, imageView,options); 

把图片变成圆形代码如下:

DisplayImageOptions options = new DisplayImageOptions.Builder()
					.cacheInMemory(true)//缓存
					.displayer(new CircleBitmapDisplayer())//圆形类
					.build();
			ImageLoader.getInstance().displayImage(URL,imageView, options);


圆形类CircleBitmapDisplayer代码如下:

import android.graphics.Bitmap;

import com.nostra13.universalimageloader.core.assist.LoadedFrom;
import com.nostra13.universalimageloader.core.display.BitmapDisplayer;
import com.nostra13.universalimageloader.core.imageaware.ImageAware;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;

public class CircleBitmapDisplayer implements BitmapDisplayer {
    protected  final int margin ;

    public CircleBitmapDisplayer() {
        this(0);
    }

    public CircleBitmapDisplayer(int margin) {
        this.margin = margin;
    }

	@Override
	public void display(Bitmap bitmap, ImageAware imageAware, LoadedFrom arg2) {
        if (!(imageAware instanceof ImageViewAware)) {
            throw new IllegalArgumentException("ImageAware should wrap ImageView. ImageViewAware is expected.");
        }

        imageAware.setImageDrawable(new CircleDrawable(bitmap, margin));
	}

}

这样显示的图片就是圆形了。

图片处理不仅在网络下载图片需要处理,拍照上传、选择本地照片上传,有时候就会对图片进行截取或者把图片变成圆形、圆角矩形显示等。

图片进行截取代码如下:

private void cropImage(Uri uri, int outputX, int outputY) {
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		// crop为true是设置在开启的intent中设置显示的view可以剪裁
		intent.putExtra("crop", "true");
		// aspectX aspectY 是宽高的比例
		intent.putExtra("aspectX", 3);
		intent.putExtra("aspectY", 4);
		// outputX,outputY 是剪裁图片的宽高
		intent.putExtra("outputX", outputX);
		intent.putExtra("outputY", outputY);
		intent.putExtra("return-data", true);
		intent.putExtra("noFaceDetection", true);
		startActivityForResult(intent, CODE_CROP);
	}

如果不想要按比例调整宽高就把宽高的比例屏蔽掉,这样就可以单独设置宽高了。

把图片变成圆形和圆角矩形代码如下:

public class Bimp {
	
	/**
	 * 
	 * @param x
	 *            图像的宽度
	 * @param y
	 *            图像的高度
	 * @param image
	 *            源图片
	 * @param outerRadiusRat
	 *            圆角的大小
	 * @return 圆形图片
	 */
	public static Bitmap createFilletPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
		// 根据源文件新建一个darwable对象
		@SuppressWarnings("deprecation")
		Drawable imageDrawable = new BitmapDrawable(image);

		// 新建一个新的输出图片
		Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(output);


		// 产生一个红色的圆形
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		
		final Rect rect = new Rect(0, 0, x, y); 
		final RectF rectF = new RectF(rect); 
		final float roundPx = x / 2; 

		paint.setAntiAlias(true); 
		canvas.drawARGB(0, 0, 0, 0); 
		
		paint.setColor(Color.RED);
		canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
		// 将源图片绘制到这个圆角矩形上
		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
		imageDrawable.setBounds(0, 0, x, y);
		canvas.saveLayer(rectF, paint, Canvas.ALL_SAVE_FLAG);
		
		imageDrawable.draw(canvas);
		canvas.restore();

		return output;
	}
	
	/**
	 * 
	 * @param x
	 *            图像的宽度
	 * @param y
	 *            图像的高度
	 * @param image
	 *            源图片
	 * @param outerRadiusRat
	 *            圆角的大小
	 * @return 圆角图片
	 */
	public static Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
		// 根据源文件新建一个darwable对象
		@SuppressWarnings("deprecation")
		Drawable imageDrawable = new BitmapDrawable(image);

		// 新建一个新的输出图片
		Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(output);

		// 新建一个矩形
		RectF outerRect = new RectF(0, 0, x, y);

		// 产生一个红色的圆角矩形
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setColor(Color.RED);
		canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint);

		// 将源图片绘制到这个圆角矩形上
		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
		imageDrawable.setBounds(0, 0, x, y);
		canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG);
		imageDrawable.draw(canvas);
		canvas.restore();

		return output;
	}
}

然后直接调用方法就ok了。

//mivavatar是ImageView控件
mivavatar.setImageBitmap(Bimp.createFilletPhoto(480, 480,
					BitmapFactory.decodeFile(filePath), (int) (dp * 1.6f)));






 

你可能感兴趣的:(Android,工作总结)