zoukankan      html  css  js  c++  java
  • android APP中的头像转换问题

    mainactivity:
    package com.example.administrator.mycoupon;

    import java.io.File;

    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;

    public class MainActivity extends Activity {

    protected static final int CHOOSE_PICTURE = 0;
    protected static final int TAKE_PICTURE = 1;
    private static final int CROP_SMALL_PICTURE = 2;
    protected static Uri tempUri;
    private ImageView iv_personal_icon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btn_change = (Button) findViewById(R.id.btn_change);
    iv_personal_icon = (ImageView) findViewById(R.id.iv_personal_icon);
    btn_change.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    showChoosePicDialog();
    }
    });
    }

    /**
    * 显示修改头像的对话框
    */
    protected void showChoosePicDialog() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("设置头像");
    String[] items = { "选择本地照片", "拍照" };
    builder.setNegativeButton("取消", null);
    builder.setItems(items, new DialogInterface.OnClickListener() {

    @Override
    public void onClick(DialogInterface dialog, int which) {
    switch (which) {
    case CHOOSE_PICTURE: // 选择本地照片
    Intent openAlbumIntent = new Intent(
    Intent.ACTION_PICK);
    openAlbumIntent.setType("image/*");
    startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);
    break;
    case TAKE_PICTURE: // 拍照
    Intent openCameraIntent = new Intent(
    MediaStore.ACTION_IMAGE_CAPTURE);
    tempUri = Uri.fromFile(new File(Environment
    .getExternalStorageDirectory(), "image.jpg"));
    // 指定照片保存路径(SD卡),image.jpg为一个临时文件,每次拍照后这个图片都会被替换
    openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
    startActivityForResult(openCameraIntent, TAKE_PICTURE);
    break;
    }
    }
    });
    builder.create().show();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) { // 如果返回码是可以用的
    switch (requestCode) {
    case TAKE_PICTURE:
    startPhotoZoom(tempUri); // 开始对图片进行裁剪处理
    break;
    case CHOOSE_PICTURE:
    startPhotoZoom(data.getData()); // 开始对图片进行裁剪处理
    break;
    case CROP_SMALL_PICTURE:
    if (data != null) {
    setImageToView(data); // 让刚才选择裁剪得到的图片显示在界面上
    }
    break;
    }
    }
    }

    /**
    * 裁剪图片方法实现
    *
    * @param uri
    */
    protected void startPhotoZoom(Uri uri) {
    if (uri == null) {
    Log.i("tag", "The uri is not exist.");
    }
    tempUri = uri;
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    // 设置裁剪
    intent.putExtra("crop", "true");
    // aspectX aspectY 是宽高的比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    // outputX outputY 是裁剪图片宽高
    intent.putExtra("outputX", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CROP_SMALL_PICTURE);
    }

    /**
    * 保存裁剪之后的图片数据
    *
    * @param
    *
    * @param picdata
    */
    protected void setImageToView(Intent data) {
    Bundle extras = data.getExtras();
    if (extras != null) {
    Bitmap photo = extras.getParcelable("data");
    photo = Utils.toRoundBitmap(photo, tempUri); // 这个时候的图片已经被处理成圆形的了
    iv_personal_icon.setImageBitmap(photo);
    uploadPic(photo);
    }
    }

    private void uploadPic(Bitmap bitmap) {
    // 上传至服务器
    // ... 可以在这里把Bitmap转换成file,然后得到file的url,做文件上传操作
    // 注意这里得到的图片已经是圆形图片了
    // bitmap是没有做个圆形处理的,但已经被裁剪了

    String imagePath = Utils.savePhoto(bitmap, Environment
    .getExternalStorageDirectory().getAbsolutePath(), String
    .valueOf(System.currentTimeMillis()));
    Log.e("imagePath", imagePath+"");
    if(imagePath != null){
    // 拿着imagePath上传了
    // ...
    }
    }
    }


    activity_main:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical" >

    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#51CA65"
    android:padding="30dp" >

    <ImageView
    android:id="@+id/iv_personal_icon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:src="@drawable/default_personal_image" />
    </RelativeLayout>

    <Button
    android:id="@+id/btn_change"
    android:layout_marginTop="6dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="修改头像" >
    </Button>

    </LinearLayout>
    </LinearLayout>


    新建一个Java Class-Utils.java:
    package com.example.administrator.mycoupon;

    /**
    * Created by Administrator on 2018/7/10.
    */

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;

    import android.graphics.Bitmap;
    import android.graphics.Bitmap.Config;
    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;

    public class Utils {

    /**
    * Save image to the SD card
    *
    * @param photoBitmap
    * @param photoName
    * @param path
    */
    public static String savePhoto(Bitmap photoBitmap, String path,
    String photoName) {
    String localPath =path ;
    if (android.os.Environment.getExternalStorageState().equals(
    android.os.Environment.MEDIA_MOUNTED)) {
    File dir = new File(path);
    if (!dir.exists()) {
    dir.mkdirs();
    }

    File photoFile = new File(path, photoName + ".png");
    FileOutputStream fileOutputStream =null ;
    try {
    fileOutputStream = new FileOutputStream(photoFile);
    if (photoBitmap !=null ) {
    if (photoBitmap.compress(Bitmap.CompressFormat.PNG, 100,
    fileOutputStream)) { // 转换完成
    localPath = photoFile.getPath();
    fileOutputStream.flush();
    }
    }
    } catch (FileNotFoundException e) {
    photoFile.delete();
    localPath = path;
    e.printStackTrace();
    } catch (IOException e) {
    photoFile.delete();
    localPath = path;
    e.printStackTrace();
    } finally {
    try {
    if (fileOutputStream !=null ) {
    fileOutputStream.close();
    fileOutputStream = null;
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    return localPath;
    }

    /**
    * 转换图片成圆形
    *
    * @param bitmap 传入Bitmap对象
    * @param tempUri
    * @return
    */
    public static Bitmap toRoundBitmap(Bitmap bitmap, Uri tempUri) {
    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;
    top = 0;
    bottom = width;
    left = 0;
    right = 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 int color = 0xff424242;
    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);
    paint.setColor(color);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
    paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
    canvas.drawBitmap(bitmap, src, dst, paint);
    return output;
    }
    }

  • 相关阅读:
    DATAX windows下安装及csv文件导入mysql简单案例
    JAVA质量属性之易用性战术分析
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    14 得到相关连的热词数据
    13 信息领域热词分析部分功能展示
    12 所学和感受
    从Android开发看MVC
    论面向服务架构(SOA)设计及其应用
    GitHub上快速创建文件夹
    GitHub将私有库(private)、公有库(public)相互转换
  • 原文地址:https://www.cnblogs.com/H-xiaofeng/p/9292785.html
Copyright © 2011-2022 走看看