android圓形頭像的選擇和剪下並儲存出圓形圖片

商清艾發表於2015-03-04

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>

相關文章