如何裁剪在ImageView上设置的位图(自定义裁剪而不是默认裁剪)?

时间:2015-03-04 09:01:08

标签: android bitmap

我尝试搜索自定义裁剪活动,但大多数都会导致默认的“com.android.camera.action.CROP”。任何人都可以帮我找到创建自定义裁剪功能的解决方案。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fr_editcrop, container, false);

        photo = (ImageView)view.findViewById(R.id.photo);

        tmp = getArguments().getString("PHOTO");

        byte [] encodeByte=Base64.decode(tmp,Base64.DEFAULT);
        bmp=BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
        photo.setImageBitmap(bmp);

3 个答案:

答案 0 :(得分:0)

使用picasso image libary进行此操作。它有太多现成的方法可用于调整大小,裁剪,拟合等。您可以直接从url设置图像ti imageview。希望它会有所帮助。谢谢。

答案 1 :(得分:0)

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.xyz); resizedBitmap =Bitmap.createBitmap(bmp, x, y, width, height);

x源中第一个像素的x坐标

y源

中第一个像素的y坐标

width每行中的像素数

height行数

答案 2 :(得分:0)

正如Nilesh Patel所讨论的,他正在尝试创建一个自定义裁剪,而不是使用默认的" com.android.camera.action.CROP"。我只想分享这段代码,为图像视图提供自定义裁剪或徒手裁剪活动。希望它会帮助你们。

首先,您需要创建一个类似CropView

的类
public class CropView extends ImageView {

 Paint paint = new Paint();
 private int initial_size = 300;
 private static Point leftTop, rightBottom, center, previous;

 private static final int DRAG= 0;
 private static final int LEFT= 1;
 private static final int TOP= 2;
 private static final int RIGHT= 3;
 private static final int BOTTOM= 4;

 private int imageScaledWidth,imageScaledHeight;
 // Adding parent class constructors   
 public CropView(Context context) {
    super(context);
    initCropView();
 }

 public CropView(Context context, AttributeSet attrs) {
     super(context, attrs, 0);
     initCropView();
 }

 public CropView(Context context, AttributeSet attrs, int defStyle) {
     super(context, attrs, defStyle);
     initCropView();
 }

 @Override
 protected void onDraw(Canvas canvas)
 {
     super.onDraw(canvas);
     if(leftTop.equals(0, 0))
         resetPoints();
     canvas.drawRect(leftTop.x, leftTop.y, rightBottom.x, rightBottom.y, paint);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
     int eventaction = event.getAction();
     switch (eventaction) { 
         case MotionEvent.ACTION_DOWN:
             previous.set((int)event.getX(), (int)event.getY());
             break; 
         case MotionEvent.ACTION_MOVE: 
             if(isActionInsideRectangle(event.getX(), event.getY())) {
                 adjustRectangle((int)event.getX(), (int)event.getY());
                 invalidate(); // redraw rectangle
                 previous.set((int)event.getX(), (int)event.getY());
             }
             break; 
         case MotionEvent.ACTION_UP: 
             previous = new Point();
             break;
     }         
     return true;
 }

 private void initCropView() {
     paint.setColor(Color.YELLOW);
     paint.setStyle(Style.STROKE);
     paint.setStrokeWidth(5);  
     leftTop = new Point();
     rightBottom = new Point();
     center = new Point();
     previous = new Point();
 }

 public void resetPoints() {
     center.set(getWidth()/2, getHeight()/2);
     leftTop.set((getWidth()-initial_size)/2,(getHeight()-initial_size)/2);
     rightBottom.set(leftTop.x+initial_size, leftTop.y+initial_size);
 }

 private static boolean isActionInsideRectangle(float x, float y) {
     int buffer = 10;
     return (x>=(leftTop.x-buffer)&&x<=(rightBottom.x+buffer)&& y>=(leftTop.y-buffer)&&y<=(rightBottom.y+buffer))?true:false;
 }

 private boolean isInImageRange(PointF point) {
     // Get image matrix values and place them in an array
     float[] f = new float[9];
     getImageMatrix().getValues(f);

     // Calculate the scaled dimensions
     imageScaledWidth = Math.round(getDrawable().getIntrinsicWidth() * f[Matrix.MSCALE_X]);
     imageScaledHeight = Math.round(getDrawable().getIntrinsicHeight() * f[Matrix.MSCALE_Y]);

     return (point.x>=(center.x-(imageScaledWidth/2))&&point.x<=(center.x+(imageScaledWidth/2))&&point.y>=(center.y-(imageScaledHeight/2))&&point.y<=(center.y+(imageScaledHeight/2)))?true:false;
 }

 private void adjustRectangle(int x, int y) {
     int movement;
     switch(getAffectedSide(x,y)) {
         case LEFT:
             movement = x-leftTop.x;
             if(isInImageRange(new PointF(leftTop.x+movement,leftTop.y+movement)))
                leftTop.set(leftTop.x+movement,leftTop.y+movement);
            break;
        case TOP:
            movement = y-leftTop.y;
            if(isInImageRange(new PointF(leftTop.x+movement,leftTop.y+movement)))
                leftTop.set(leftTop.x+movement,leftTop.y+movement);
            break;
        case RIGHT:
            movement = x-rightBottom.x;
            if(isInImageRange(new PointF(rightBottom.x+movement,rightBottom.y+movement)))
                rightBottom.set(rightBottom.x+movement,rightBottom.y+movement);
            break;
        case BOTTOM:
            movement = y-rightBottom.y;
            if(isInImageRange(new PointF(rightBottom.x+movement,rightBottom.y+movement)))
                rightBottom.set(rightBottom.x+movement,rightBottom.y+movement);
            break;      
        case DRAG:
            movement = x-previous.x;
            int movementY = y-previous.y;
            if(isInImageRange(new PointF(leftTop.x+movement,leftTop.y+movementY)) && isInImageRange(new PointF(rightBottom.x+movement,rightBottom.y+movementY))) {
                leftTop.set(leftTop.x+movement,leftTop.y+movementY);
                rightBottom.set(rightBottom.x+movement,rightBottom.y+movementY);
            }
            break;
    }
}

private static int getAffectedSide(float x, float y) {
    int buffer = 10;
    if(x>=(leftTop.x-buffer)&&x<=(leftTop.x+buffer))
        return LEFT;
    else if(y>=(leftTop.y-buffer)&&y<=(leftTop.y+buffer))
        return TOP;
    else if(x>=(rightBottom.x-buffer)&&x<=(rightBottom.x+buffer))
        return RIGHT;
    else if(y>=(rightBottom.y-buffer)&&y<=(rightBottom.y+buffer))
        return BOTTOM;
    else
        return DRAG;
}

public byte[] getCroppedImage() {
    BitmapDrawable drawable = (BitmapDrawable)getDrawable();
    float x = leftTop.x-center.x+(drawable.getBitmap().getWidth()/2);
    float y = leftTop.y-center.y+(drawable.getBitmap().getHeight()/2);
    Bitmap cropped = Bitmap.createBitmap(drawable.getBitmap(),(int)x,(int)y,(int)rightBottom.x-(int)leftTop.x,(int)rightBottom.y-(int)leftTop.y);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    cropped.compress(Bitmap.CompressFormat.PNG, 100, stream);
    return stream.toByteArray();
  }
 }

我做的是,我扩展了ImageView并添加了裁剪功能。它很容易使用。保存类后,只需在布局中使用它。

  <"your package name".CropView
    android:id="@+id/image_preview"
    android:layout_width="fill_parent"
    android:layout_height="match_parent" />

在您的活动中调用此裁剪视图,如下所示

@Override
protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);

 setContentView(R.layout.crop_layout);


    myCropView = new CropView(this);

    tmp = getArguments().getString("PHOTO");

      byte [] encodeByte=Base64.decode(tmp,Base64.DEFAULT);
      bmp=BitmapFactory.decodeByteArray(encodeByte, 0, encodeByte.length);
      myCropView.setImageBitmap(bmp);

 }

多数民众赞成!希望能帮助到你!如果您遇到任何问题,请随时询问:)