Android 拍照(获取原图),选择照片并且剪切图片

好了废话不多说,看代码模块讲解.

/**
     * 对话框 选择相片或者拍照
     * @param context
     */
    public void showPicturePicker(final Context context) {

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setTitle("图片来源");
        builder.setNegativeButton("取消", null);
        builder.setItems(new String[] { "拍照", "相册" },
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = null;
                        switch (which) {
                        case 0:
                            intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                            startActivityForResult(intent, TAKE_PICTURE);
                            break;

                        case 1:
                            intent = new Intent(Intent.ACTION_GET_CONTENT, null);
                            intent.setType("image/*");
                            intent.putExtra("crop", "true");
                            intent.putExtra("aspectX", 3);
                            intent.putExtra("aspectY", 4);
                            intent.putExtra("outputX", w + 10);
                            intent.putExtra("outputY", h + 10);
                            intent.putExtra("scale", true);
                            intent.putExtra("return-data", false);
                            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
                            intent.putExtra("outputFormat",
                                    Bitmap.CompressFormat.PNG.toString());
                            intent.putExtra("noFaceDetection", false);
                            startActivityForResult(intent, CHOOSE_PICTURE);
                            break;
                        }
                    }
                });
        builder.create().show();
    }

这里是拍照对话框,调用系统自带,实际到项目中,大部分会采用自定义对话框,这里就不麻烦了,用系统的方便.
第一个是拍照:

Intent intent = null;
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                           intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);                         startActivityForResult(intent, TAKE_PICTURE);

imageUri 是为了得到原图,如果不这样写,那么你得到的就是相机的压缩图,大部分人不愿意这样做.所以这里就指定了路径.
第二个是选择相册:

intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType("image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 3);
intent.putExtra("aspectY", 4);
intent.putExtra("outputX", w + 10);
intent.putExtra("outputY", h + 10);
intent.putExtra("scale", true);
intent.putExtra("return-data", false);                          intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);                         intent.putExtra("outputFormat",                                 Bitmap.CompressFormat.PNG.toString());                          intent.putExtra("noFaceDetection", false);                          startActivityForResult(intent, CHOOSE_PICTURE);

这些参数和上面有一些不一样,这是为了得到选择图片的指定大小.

剪切图片代码:

/**
     * 剪切失败
     * 
     * @param uri
     * @param outputX
     * @param outputY
     * @param requestCode
     */
    private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 3);
        intent.putExtra("aspectY", 4);
        intent.putExtra("outputX", outputX);
        intent.putExtra("outputY", outputY);
        intent.putExtra("scale", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        intent.putExtra("return-data", false);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection
        startActivityForResult(intent, requestCode);
    }

通过图片的设定的宽高去调用系统裁剪得到剪切后的图片,然后返回onActivityResult进行处理.

通过图片指定的 uri获得Bitmap.


    /**
     * 获取图片
     * 
     * @param uri
     * @return
     * @throws IOException
     */
    private Bitmap decodeUriAsBitmap(Uri uri) {
        Bitmap bitmap = null;
        FileOutputStream outputStream = null;
        try {
            bitmap = BitmapFactory.decodeStream(context.getContentResolver()
                    .openInputStream(uri));
            outputStream = new FileOutputStream("/mnt/sdcard/test/usericon.png");
            bitmap.compress(CompressFormat.PNG, 100, outputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        } finally {
            try {
                outputStream.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                outputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        mBitmap = bitmap;
        return bitmap;
    }

上传图片代码:

    /**
     * 上传图像
     */
    private void uploadUserImage() {
        Log.d("ppp", "setUserImage()-----");
        final File file = new File("/mnt/sdcard/test/usericon.png");
        if (file.exists()) {
            new Thread() {
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    super.run();
                    boolean ff = postFile.postFile(file);
                    handle();

                }
            };
        }
    }

得到图片文件,调用下面这方法进行上次.我把 部分参数改为中文提示了.
这块是上传图片的方法,是用apache开源库做的.

/**
     * 
     * @param f上传的图片文件
     * @return
     */
    public boolean postFile(File file) {
        if (file == null) {
            return false;
        }
        String url = "上传路径";
        HttpClient client = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        HttpResponse response = null;
        try {
            MultipartEntity mpEntity = new MultipartEntity();
            long l = file.length();
            Log.i("tag", l + "");
            ContentBody cbFile = new FileBody(file, "image/png");
            ContentBody cbuserid = new StringBody("用户 ID");
            mpEntity.addPart("avatar", cbFile);// 上传文件
            mpEntity.addPart("user_ticket", cbuserid);// 上传用户名
            httpPost.setEntity(mpEntity);
            response = client.execute(httpPost);
            if (response != null
                    && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                String json = EntityUtils.toString(response.getEntity(),
                        "UTF-8");
                JSONObject jObject = new JSONObject(json);
                if (jObject != null) {
                    if (jObject.has("status")) {
                        int value = jObject.getInt("status");
                        if (value == 1) {
                            return true;
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return false;
    }

好了,到此拍照上传选择图片剪切讲解结束了.有问题留言.
点我下载代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android中,可以通过自定义View的方式来实现图片剪切圆角的效果。以下是一个简单的示例代码: 1. 自定义一个RoundImageView类,继承自ImageView: ``` public class RoundImageView extends ImageView { private Paint mPaint; private RectF mRectF; private float mRadius; public RoundImageView(Context context) { this(context, null); } public RoundImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RoundImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); mRectF = new RectF(); mPaint.setAntiAlias(true); } @Override protected void onDraw(Canvas canvas) { Drawable drawable = getDrawable(); if (drawable == null) { super.onDraw(canvas); return; } if (getWidth() == 0 || getHeight() == 0) { return; } Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); Bitmap roundBitmap = getRoundBitmap(bitmap, getWidth(), getHeight(), mRadius); mPaint.reset(); canvas.drawBitmap(roundBitmap, 0, 0, mPaint); } private Bitmap getRoundBitmap(Bitmap bitmap, int width, int height, float radius) { Bitmap output = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); mRectF.set(0, 0, width, height); canvas.drawRoundRect(mRectF, radius, radius, mPaint); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, null, mRectF, mPaint); return output; } public void setRadius(float radius) { this.mRadius = radius; invalidate(); } } ``` 2. 在xml布局文件中引用这个RoundImageView: ``` <com.example.RoundImageView android:id="@+id/iv_round" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="centerCrop" android:src="@drawable/test" app:radius="20dp"/> ``` 3. 在Activity中找到这个RoundImageView,并调用setRadius()方法设置圆角半径: ``` RoundImageView roundImageView = findViewById(R.id.iv_round); roundImageView.setRadius(20); ``` 这样就可以实现在Android中对图片进行圆角剪切的效果了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值