在我的应用程序中,我需要从图库/相机拍摄图像,裁剪这些图像,然后将裁剪后的图像保存在其他位置。下面的代码完成了大部分内容,但无法根据自己的喜好裁剪图像。使用下面的代码,我可以使用图像中间坐标的4个坐标,顶部,底部,左侧和右侧裁剪图像;但我需要使用8个坐标进行裁剪。 This image显示了我的意思。
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);
*/
}
}
}
答案 0 :(得分:0)
这是一种从坐标数组
创建最小所需矩形的简单方法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
希望这有助于并享受您的工作