繁体   English   中英

如何在Android中进行自定义图像裁剪

[英]How to do custom image cropping in android

在我的应用程序中,我需要从画廊/相机中拍摄图像,裁剪这些图像,然后将裁剪的图像保存在其他位置。 下面的代码可以完成大部分操作,但是无法按我的喜好裁剪图像。 使用下面的代码,我可以使用图像中间坐标的顶部,底部,左侧和右侧的4个坐标来裁剪图像; 但我需要使用8个坐标进行裁剪。 此图显示了我的意思。

public class MainActivity extends Activity {
  private static final int PICK_FROM_CAMERA = 1;
  private static final int PICK_FROM_GALLERY = 2;
  private static final int PRESS_OK = 3;
  ImageView imgview;
  String m_path;
  Bitmap m_thePic;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    imgview = (ImageView) findViewById(R.id.imageView1);
    Button buttonCamera = (Button) findViewById(R.id.btn_take_camera);
    Button buttonGallery = (Button) findViewById(R.id.btn_select_gallery);
    Button buttonOk = (Button) findViewById(R.id.btn_ok);

    File folder = new File(Environment.getExternalStorageDirectory().toString() + "/Images/");
    folder.mkdirs();
    buttonCamera.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        // call android default camera
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT,
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString());
        // ******** code for crop image
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 0);
        intent.putExtra("aspectY", 0);
        intent.putExtra("outputX", 100);
        intent.putExtra("outputY", 150);

        try {
          intent.putExtra("return-data", true);
          startActivityForResult(intent, PICK_FROM_CAMERA);
        } catch (ActivityNotFoundException e) {
          // Do nothing for now
        }
      }
    });
    buttonGallery.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        // TODO Auto-generated method stub
        Intent intent = new Intent();
        // call android default gallery
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        // ******** code for crop image
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 0);
        intent.putExtra("aspectY", 0);
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", 150);

        try {
          intent.putExtra("return-data", true);
          startActivityForResult(Intent.createChooser(intent, "Complete action using"), 1);
        } catch (ActivityNotFoundException e) {
          // Do nothing for now
        }
      }
    });
    buttonOk.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
        String m_path = Environment.getExternalStorageDirectory().toString();
        File m_imgDirectory = new File(m_path + "/Images/");
        File m_file = new File(m_path);
        String m_fileid = "nm_tech" + System.currentTimeMillis() + "";
        m_file = new File(m_path, "/Images/" + m_fileid + ".jpg");
        Uri outputFileUri = Uri.fromFile(m_file);

        Intent intent = new Intent(MainActivity.this,
                                   ImageGalleryDemoActivity.class);
        intent.putExtra("image", m_fileid);
        startActivity(intent);
        // startActivityForResult(intent,PRESS_OK);
        // call android default camera
        // Toast.makeText(getApplicationContext(), ,1234).show();
      }
    });
  }

  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Bundle extras = data.getExtras();
    Bitmap m_thePic = extras.getParcelable("data");
    String m_path = Environment.getExternalStorageDirectory().toString();
    File m_imgDirectory = new File(m_path + "/Images/");
    if (!m_imgDirectory.exists()) {
      m_imgDirectory.mkdir();
    }
    OutputStream m_fOut = null;
    File m_file = new File(m_path);
    m_file.delete();
    String m_fileid = "nm_tech" + System.currentTimeMillis() + "";
    m_file = new File(m_path, "/Images/" + m_fileid + ".jpg");
    try {
      if (!m_file.exists()) {
        m_file.createNewFile();
      }
      m_fOut = new FileOutputStream(m_file);
      Bitmap m_bitmap = m_thePic.copy(Bitmap.Config.ARGB_8888, true);
      m_bitmap.compress(Bitmap.CompressFormat.PNG, 100, m_fOut);
      m_fOut.flush();
      m_fOut.close();
      MediaStore.Images.Media.insertImage(getContentResolver(),
                      m_file.getAbsolutePath(),
                                          m_file.getName(),
                                          m_file.getName());
    } catch (Exception p_e) {
    }

    if (requestCode == PICK_FROM_CAMERA) {
      if (extras != null) {
        // Bitmap photo = extras.getParcelable("data");
        imgview.setImageBitmap(m_thePic);
      }
    }

    if (requestCode == PICK_FROM_GALLERY) {
      // Bundle extras2 = data.getExtras();
      if (extras != null) {
        imgview.setImageBitmap(m_thePic);
      }
    }

    if (requestCode == PRESS_OK) {
      Bundle extras11 = data.getExtras();
      Bitmap bmp = (Bitmap) extras.get("data");

      /*
       * Bitmap photo = extras.getParcelable("data");
       * imgview.setImageBitmap(photo); Intent n=new
       * Intent(getApplicationContext(),ImageGalleryDemoActivity.class);
       * n.putExtra("data",photo); startActivity(n);
       */
    }
  }
}

这是一种简单的方法,您可以从一组坐标中创建所需的最小矩形

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);             
    setContentView(R.layout.activity_main);
    Rect r = getRect(new int[]{10, 10, 20, 20, 30, 30}, new int[]{20, 100, 10, 110, 20, 100});
    System.out.println(r.left + " " + r.top + " " + r.bottom + " " + r.right);
}

public Rect getRect(int[] x, int y[]){
    Rect r = new Rect();
        // Set the first coordinate, in order not to include 0, 0
    r.set(x[0], y[0], x[0], y[0]);
    for(int i = 1; i < x.length; i++){
        r.union(x[i], y[i]);
    }
    return r;
}

编辑:看起来你有8点,只是像这样调用此getRect

Rect rectToDraw = getRect(new int{yourx1, yourx2, yourx3, yourx4, yourx5, yourx6, yourx7, yourx8,}, new int{youry1, youry2, youry3, youry4, youry5, youry6, youry7, youry8});

您可以将这个函数传递给您想要的许多点,而不仅仅是8点

希望这对您有所帮助,并祝您工作愉快

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM