android 自定义比例裁剪图片(拍照 相册)方式

先说下我这个有啥好处 主要是能够自定义设置裁剪图片的比例.比如 :今天产品 给你说裁剪 成16:9 的图片. 你做好了 OK 明天 产品又和你说 裁剪成10:7 的图片 ,你是不是要吐血, 我这里只要设置一行代码就可以改变裁剪的比例.

OK 还是老规矩 先上效果图 看看啥样子

这里写图片描述

现在上传的还打上水印了 以前还没有呢. 感觉CSDN博客总会挂啊 上次我半天没打开 后来 问技术支持 说是阿里云哪里挂了 正在重启…

好了 不扯其他的了 我这里的比例是10: 7 的 ,来看下我的目录结构把

这里写图片描述

讲下大致原理 照相或者相册返回图片的地址 这个就不说了 得到地址.

创建一个自定义RelativeLayout ClipImageLayout 这个是裁剪视图 .里面有两个自定义view

1. ClipImageBorderView 绘制阴影截图视图 这个主要绘制了阴影还有边框 这个是界面

2.ClipZoomImageView 裁剪的缩放视图. 这个是实际裁剪的 实际裁剪在这里裁剪 创建bitmap 宽度是确定的 就是屏幕宽度

高度就是 屏幕高度减去 裁剪边框距离屏幕的高度除以2 代码里面有体现 注释.

1 我还集成了从相册选取和照相选取图片的地址 PhotoUtil 看代码把

使用方法自定义比例

这里写图片描述

贴一下主界面的代码

package com.example.clipphoto;

import java.io.File;
import java.io.IOException;

import com.example.clipphoto.util.BitmapUtils;
import com.example.clipphoto.util.LogUtils;
import com.example.clipphoto.util.PhotoUtil;

import android.app.Activity;
import android.content.Context;
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.view.View;
import android.widget.ImageView;
import android.widget.Toast;
/**
 * 主界面
 * @author liuml
 *
 */
public class MainActivity extends Activity {
	private PhotoUtil photoUtil;
	private ImageView iv_bg;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv_bg = (ImageView) findViewById(R.id.iv_bg);

	}


	public void show(View view) {
		photoUtil = new PhotoUtil(MainActivity.this);
		photoUtil.showDialog();
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);

		// 相册返回
		if (PhotoUtil.CAMRA_SETRESULT_CODE == requestCode) {
			if (resultCode == RESULT_OK) {
				// 相册选中图片路径
				String cameraPath = photoUtil.getCameraPath(data);
				Bitmap bitmap = photoUtil.readBitmapAutoSize(cameraPath);
				iv_bg.setImageBitmap(bitmap);
				String str = photoUtil.bitmaptoString(bitmap);
				LogUtils.d("相相册选中路径  = " + cameraPath);
				startClipActivity(cameraPath);
			}
		}
		// 相机返回
		else if (PhotoUtil.PHOTO_SETRESULT_CODE == requestCode) {
			if (resultCode == RESULT_OK) {
				String photoPath = photoUtil.getPhotoPath();
				Bitmap bitmap = photoUtil.readBitmapAutoSize(photoPath);
				String str = photoUtil.bitmaptoString(bitmap);
				iv_bg.setImageBitmap(bitmap);
				LogUtils.d("相机选中路径  = " + photoPath);
				startClipActivity(photoPath);

			}
		}
		// 裁剪返回
		else if (PhotoUtil.PHOTO_CORPRESULT_CODE == requestCode) {
			if (resultCode == RESULT_OK) {
				LogUtils.d("裁剪返回  = ");
				String path = data.getStringExtra("path");
				BitmapUtils bitmapUtils = new BitmapUtils(getApplicationContext());
		    	Bitmap bitmap = bitmapUtils.decodeFile(path);
		    	iv_bg.setImageBitmap(bitmap);
			}
		}

	}

	public void startClipActivity(String path) {

		Intent intent = new Intent(this, PhotoClipActivity.class);
		intent.putExtra("path", path);
		startActivityForResult(intent, PhotoUtil.PHOTO_CORPRESULT_CODE);
	}
}

好了 发demo 了 我感觉写一些小demo 还是用eclipse方便一些. 主要eclipse 可以放很多个项目 …

这是我的demo快去下载把

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
Android自定义图片裁剪可以通过使用自定义View和Bitmap对象来实现。以下是一些步骤: 1. 创建自定义View类,继承自View类。在onDraw()方法中绘制Bitmap对象。 2. 设置触摸事件,获取用户手指操作的坐标,计算出裁剪区域的左上角和右下角坐标。 3. 在onTouchEvent()方法中重绘View,绘制裁剪后的Bitmap对象。 4. 使用Matrix对象进行缩放和旋转操作。 下面是一个简单的示例代码: ``` public class CropImageView extends View { private Bitmap mBitmap; private Paint mPaint; private Rect mRect; private Matrix mMatrix; private float mStartX; private float mStartY; private float mEndX; private float mEndY; public CropImageView(Context context) { super(context); init(); } public CropImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(5); mPaint.setColor(Color.RED); mRect = new Rect(); mMatrix = new Matrix(); } public void setImageBitmap(Bitmap bitmap) { mBitmap = bitmap; invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mBitmap != null) { canvas.drawBitmap(mBitmap, mMatrix, null); } canvas.drawRect(mRect, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mStartX = event.getX(); mStartY = event.getY(); mEndX = mStartX; mEndY = mStartY; break; case MotionEvent.ACTION_MOVE: mEndX = event.getX(); mEndY = event.getY(); break; case MotionEvent.ACTION_UP: mEndX = event.getX(); mEndY = event.getY(); break; } calculateRect(); invalidate(); return true; } private void calculateRect() { float left = Math.min(mStartX, mEndX); float top = Math.min(mStartY, mEndY); float right = Math.max(mStartX, mEndX); float bottom = Math.max(mStartY, mEndY); mRect.set((int) left, (int) top, (int) right, (int) bottom); float centerX = (left + right) / 2; float centerY = (top + bottom) / 2; mMatrix.reset(); mMatrix.postTranslate(-centerX, -centerY); mMatrix.postRotate(45); mMatrix.postScale(0.5f, 0.5f); mMatrix.postTranslate(centerX, centerY); } } ``` 这个示例代码实现了一个简单的图片裁剪功能,并在裁剪后对图片进行了缩放和旋转。你可以根据自己的需求修改代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值