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>
相關文章
- Android 圓形頭像 相簿和拍照裁剪選取Android
- Flutter 圓形/圓角頭像Flutter
- CSS圓形圖片效果CSS
- android圖片處理,讓圖片變成圓形Android
- Glide實現圓角圖片,以及圓形圖片IDE
- Android自定義View之圖片外形特效——輕鬆實現圓角和圓形圖片AndroidView特效
- Android中呼叫攝像頭拍照儲存,並在相簿中選擇圖片顯示Android
- 基於 GD 庫生成圓形頭像
- CGContextRef處理圓形圖片GCContext
- 微信頭像生成圓形邀請卡
- Android 圓角、圓形 ImageView 實現AndroidView
- Android中圖片圓形設定三種方法介紹Android
- 微信小程式裁剪圖片成圓形微信小程式
- 使用 HTML5 Canvas 實現圓形圖片裁剪並上傳HTMLCanvas
- Kotlin 背景圓頭像圖Kotlin
- Android 開發:glide圓角,圓形,效率問題AndroidIDE
- 微信小程式之裁剪圖片成圓形微信小程式
- Android 自定義圓形旋轉進度條,仿微博頭像載入效果Android
- Android自定義圓形進度條Android
- Android 圓形ProgressBar 改變顏色Android
- 微信小程式獲取使用者頭像修改為圓形微信小程式
- Android Reveal圓形Activity轉場動畫Android動畫
- 圓形放大的hover效果
- 圓形、扇形選單,支援移動、桌面
- canvas 繪製圓形Canvas
- win10系統怎麼設定登陸影像為圓形_win10將登入介面頭像設定為圓形教程Win10
- 圓形視訊和圓角視訊的一種實現方式
- 一個圓形時鐘
- canvas圓形時鐘效果Canvas
- SVG <circle> 繪製圓形SVG
- SVG圓形鐘錶效果SVG
- u3d 呼叫android相機和相簿裁剪成圓形3DAndroid
- 標準圓形餅圖Python繪製方法Python
- CSS畫出半圓,四分之一圓,三角等圖形CSS
- 頭像點選檢視大圖和儲存功能實現(儲存的細節處理)
- JavaScript 動態圓形鐘錶JavaScript
- Flutter 波浪圓形進度條Flutter
- 美圖秀秀怎麼摳圖?美圖秀秀對圖片進行圓形摳圖的教程
- 別用圖片了,CSS遮罩合成實現帶圓角的環形loading動畫CSS遮罩動畫