android圆形头像的选择和剪切并存储出圆形图片

android圆形头像的选择和剪切并存储出圆形图片

   本人第一篇处女作有不足的地方请大家指出。废话不多说了直接开整大家需要的东西:

   由于工作需要需要弄个圆形头像并且存图传到服务器于是有了以下的代码:

mport java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
 
public class CopyOfImageScaleActivity extends Activity implements View.OnClickListener {
    /** Called when the activity is first created. */
    private Button selectImageBtn;
    private ImageView imageView;
     
    private File sdcardTempFile;
    private AlertDialog dialog;
    private int crop = 180;
	
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        selectImageBtn = (Button) findViewById(R.id.selectImageBtn); //头像框
        imageView = (ImageView) findViewById(R.id.imageView);//选择头像
 
        selectImageBtn.setOnClickListener(this);
        sdcardTempFile = new File("/mnt/sdcard/", "abcdefg.jpg");//路径可以自己选择只是参考
    }
    @Override
    public void onClick(View v) {
        if (v == selectImageBtn) {
            if (dialog == null) {
                dialog = new AlertDialog.Builder(this).setItems(new String[] { "相机", "相册" }, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if (which == 0) {
                            Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
                            intent.putExtra("output", Uri.fromFile(sdcardTempFile));
                            intent.putExtra("crop", "true");
                            intent.putExtra("aspectX", 1);// 裁剪框比例
                            intent.putExtra("aspectY", 1);
                            intent.putExtra("outputX", crop);// 输出图片大小
                            intent.putExtra("outputY", crop);
                            startActivityForResult(intent, 101);
                        } else {
                            Intent intent = new Intent("android.intent.action.PICK");
                            intent.setDataAndType(MediaStore.Images.Media.INTERNAL_CONTENT_URI, "image/*");
                            intent.putExtra("output", Uri.fromFile(sdcardTempFile));
                            intent.putExtra("crop", "true");
                            intent.putExtra("aspectX", 1);// 裁剪框比例
                            intent.putExtra("aspectY", 1);
                            intent.putExtra("outputX", crop);// 输出图片大小
                            intent.putExtra("outputY", crop);
                            startActivityForResult(intent, 100);
                        }
                    }
                }).create();
            }
            if (!dialog.isShowing()) {
                dialog.show();
            }
        }
    }
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (resultCode == RESULT_OK) {
            Bitmap bmp = BitmapFactory.decodeFile(sdcardTempFile.getAbsolutePath());
            imageView.setImageBitmap(toRoundBitmap(bmp));
        }
    }
    public Bitmap toRoundBitmap(Bitmap bitmap) {
		int width = bitmap.getWidth();
		int height = bitmap.getHeight();
		float roundPx;
		float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;
		if (width <= height) {
			roundPx = width / 2;

			left = 0;
			top = 0;
			right = width;
			bottom = width;

			height = width;

			dst_left = 0;
			dst_top = 0;
			dst_right = width;
			dst_bottom = width;
		} else {
			roundPx = height / 2;

			float clip = (width - height) / 2;

			left = clip;
			right = width - clip;
			top = 0;
			bottom = height;
			width = height;

			dst_left = 0;
			dst_top = 0;
			dst_right = height;
			dst_bottom = height;
		}

		Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
		Canvas canvas = new Canvas(output);

		final Paint paint = new Paint();
		final Rect src = new Rect((int) left, (int) top, (int) right, (int) bottom);
		final Rect dst = new Rect((int) dst_left, (int) dst_top, (int) dst_right, (int) dst_bottom);
		final RectF rectF = new RectF(dst);

		paint.setAntiAlias(true);// 设置画笔无锯齿

		canvas.drawARGB(0, 0, 0, 0); // 填充整个Canvas

		// 以下有两种方法画圆,drawRounRect和drawCircle
//		canvas.drawRoundRect(rectF, roundPx, roundPx, paint);// 画圆角矩形,第一个参数为图形显示区域,第二个参数和第三个参数分别是水平圆角半径和垂直圆角半径。
		 canvas.drawCircle(roundPx, roundPx, roundPx, paint);

		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));// 设置两张图片相交时的模式,参考http://trylovecatch.iteye.com/blog/1189452
		canvas.drawBitmap(bitmap, src, dst, paint); // 以Mode.SRC_IN模式合并bitmap和已经draw了的Circle
		
		ByteArrayOutputStream logoStream = new ByteArrayOutputStream();
		boolean res = output.compress(Bitmap.CompressFormat.PNG, 100, logoStream);
		byte[] logoBuf = logoStream.toByteArray();//将图像保存到byte[]中
        Bitmap temp = BitmapFactory.decodeByteArray(logoBuf, 0, logoBuf.length);//将图像从byte[]中读取生成Bitmap 对象 temp
        saveMyBitmap("tttt",temp);//将图像保存到SD卡中
        delFolder("/mnt/sdcard/abcdefg.jpg");
		return temp;
	}
    
    public void saveMyBitmap(String bitName,Bitmap mBitmap){
        File f = new File("/sdcard/" + bitName + ".png");
        try {
         f.createNewFile();
        } catch (IOException e) {
         // TODO Auto-generated catch block
        }
        FileOutputStream fOut = null;
        try {
         fOut = new FileOutputStream(f);
        } catch (Exception e) {
         e.printStackTrace();
        }
        mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        try {
         fOut.flush();
        } catch (IOException e) {
         e.printStackTrace();
        }
        try {
         fOut.close();
        } catch (IOException e) {
         e.printStackTrace();
        }
       }
    /**
         * 删除文件夹
         * @param filePathAndName String 文件夹路径及名称 如c:/fqf
         * @param fileContent String
         * @return boolean
         */
        public void delFolder(String folderPath) {
                try {
                        delAllFile(folderPath); //删除完里面所有内容
                        String filePath = folderPath;
                        filePath = filePath.toString();
                        java.io.File myFilePath = new java.io.File(filePath);
                        myFilePath.delete(); //删除空文件夹

                }
                catch (Exception e) {
                        System.out.println("删除文件夹操作出错");
                        e.printStackTrace();

                }
        }

        /**
         * 删除文件夹里面的所有文件
         * @param path String 文件夹路径 如 c:/fqf
         */
        public void delAllFile(String path) {
                File file = new File(path);
                if (!file.exists()) {
                        return;
                }
                if (!file.isDirectory()) {
               return;
                }
                String[] tempList = file.list();
                File temp = null;
                for (int i = 0; i < tempList.length; i++) {
                        if (path.endsWith(File.separator)) {
                                temp = new File(path + tempList[i]);
                        }
                        else {
                                temp = new File(path + File.separator + tempList[i]);
                        }
                        if (temp.isFile()) {
                                temp.delete();
                        }
                        if (temp.isDirectory()) {
                                delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件
                                delFolder(path+"/"+ tempList[i]);//再删除空文件夹
                        }
                }
        } 

	
}<span style="white-space:pre">							</span>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值