想要在用户从图库中选择图像后裁剪图像。
所以基本上当用户从图库中选择图像时,他应该能够裁剪它,当他点击确定时,图像应该被发送到服务器。
点击按钮,我有这个启动图库的代码。
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent,RESULT_TRUE);
然后我有这个代码从库中选择图像并将其上传到firebase。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_TRUE && resultCode == RESULT_OK) {
dialog.show();
Uri url = data.getData();
StorageReference filepath = mstorage.child("photos").child(url.getLastPathSegment());
filepath.putFile(url).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getContext(), "upload done", Toast.LENGTH_LONG).show();
Uri downloadurl = taskSnapshot.getDownloadUrl();
String imageUrl = downloadurl.toString();
Glide.with(getContext()).load(imageUrl).centerCrop().placeholder(R.drawable.ic_menu_camera).crossFade().into(mImage1);
SubscriberService subscriberService = new SubscriberService();
subscriberService.addItemChildList(AddImagesFragment.this, mAuth.getCurrentUser().getUid(), "images", imageUrl, place);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
有人可以帮我修改裁剪图片的代码。
由于
答案 0 :(得分:0)
您可以使用此方法执行裁剪: -
private void performCrop(String picUri) {
try {
//Start Crop Activity
Intent cropIntent = new Intent("com.android.camera.action.CROP");
// indicate image type and Uri
File f = new File(picUri);
Uri contentUri = Uri.fromFile(f);
cropIntent.setDataAndType(contentUri, "image/*");
// set crop properties
cropIntent.putExtra("crop", "true");
// indicate aspect of desired crop
cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);
// indicate output X and Y
cropIntent.putExtra("outputX", 280);
cropIntent.putExtra("outputY", 280);
// retrieve data on return
cropIntent.putExtra("return-data", true);
// start the activity - we handle returning in onActivityResult
startActivityForResult(cropIntent, RESULT_CROP);
}
// respond to users whose devices do not support the crop action
catch (ActivityNotFoundException anfe) {
// display an error message
String errorMessage = "your device doesn't support the crop action!";
Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
toast.show();
}
}
请参阅链接android:select image from gallery then crop that and show in an imageview
答案 1 :(得分:0)
查看this教程..
答案 2 :(得分:0)
看看这个library,可能会得到一个合适的解决方案。
首先将uCrop添加到Gradle中 要使用它,请写上onActivityResult,
case IMAGE:
UCrop.of(data.getData(), Uri.fromFile(new File(this.getCacheDir(), "IMG_" + System.currentTimeMillis())))
.start(YourActivity.this);
break;
之后处理uCrop结果onActivityResults为(你可以采用一个switch case来处理那里的多个请求代码):
case UCrop.REQUEST_CROP:
Uri imgUri = UCrop.getOutput(data);
if (imgUri != null) {
String selectedImage = imgUri.getPath();
// load selectedImage into ImageView
} else {
Snackbar.make(view, R.string.str_bad_image_file, Snackbar.LENGTH_LONG)
.show();
}
break;
case UCrop.RESULT_ERROR:
Snackbar.make(view, R.string.str_bad_image_file, Snackbar.LENGTH_LONG)
.show();
break;
答案 3 :(得分:0)
看看这个library。它提供基本的裁剪功能,并被许多人使用
答案 4 :(得分:0)
这是一个经过良好测试的代码,因此它肯定会有效。尝试使用下面的代码,裁剪图像:
private CropImageView img_crop;
private int CROP_RESULT = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_crop_);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.back_white);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
img_crop = (CropImageView) findViewById(R.id.img_crop);
img_crop.setInitialFrameScale(0.75f);
img_crop.setAnimationEnabled(true);
img_crop.setAnimationDuration(300);
img_crop.setCropMode(CropImageView.CropMode.RATIO_3_4);
configureDefaultImageLoader(Crop_Activity.this);
Intent intent = getIntent();
Bundle b = intent.getExtras();
String path = " ";
final String type = b.getString("type");
path = b.getString("BitmapImage");
Log.e("Crop_Uri>>", path.toString());
{
try {
InputStream image_stream = null;
image_stream = getContentResolver().openInputStream(Uri.parse("file://" + path.toString()));
Bitmap bitmap1 = BitmapFactory.decodeStream(image_stream);
if (bitmap1 != null) {
bitmap1.recycle();
bitmap1 = null;
}
ImageLoader.getInstance().displayImage(ImageDownloader.Scheme.FILE.wrap(path.toString()), img_crop);
// img_crop.setImageBitmap(bitmap1);
Log.e("Image//", "//" + "yes");
} catch (Exception e) {
//handle exception
Log.e("ExceptionImage>>", "//" + e);
}
}
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/* Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();*/
if (img_crop.getImageBitmap() != null) {
Bitmap crop_bitmap = img_crop.getCroppedBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
File dest = new File(getFilename());
try {
FileOutputStream out = new FileOutputStream(dest);
crop_bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
byte[] byteArray = stream.toByteArray();
Intent intent = new Intent();
intent.putExtra("croped_bitmap_uri", dest.getAbsolutePath());
intent.setAction("ok");
setResult(CROP_RESULT, intent);
deleteFile();
finish();
} else {
Toast.makeText(Crop_Activity.this, "Crop Images Not Processed !", Toast.LENGTH_SHORT).show();
}
}
});
}
public String getFilename() {
File myDirectory = new File(Environment.getExternalStorageDirectory(), "Konnect_Mom/Konnect_Mom_cropped_img");
if (!myDirectory.exists()) {
myDirectory.mkdirs();
}
String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
String mImageName = "cropped_img" + ".jpg";
String uriSting = (myDirectory.getAbsolutePath() + "/" + mImageName);
return uriSting;
}
public void deleteFile() {
File file = new File(Environment.getExternalStorageDirectory() + "Konnect_Mom/Konnect_Mom_cropped_img/cropped_img.jpg");
if (file.exists()) {
file.delete();
}
}
public static void configureDefaultImageLoader(Context ctx) {
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(ctx).threadPriority(Thread.NORM_PRIORITY - 2).denyCacheImageMultipleSizesInMemory().diskCacheFileNameGenerator(new Md5FileNameGenerator()).tasksProcessingOrder(QueueProcessingType.FIFO).build();
ImageLoader.getInstance().init(config);
DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
.showImageOnLoading(android.R.drawable.stat_sys_download)
.showImageForEmptyUri(android.R.drawable.ic_dialog_alert)
.showImageOnFail(android.R.drawable.stat_notify_error)
.considerExifParams(true)
.bitmapConfig(Bitmap.Config.RGB_565)
.imageScaleType(ImageScaleType.EXACTLY_STRETCHED) //filled width
.build();
}
}
只需复制上面的代码并将其粘贴到标题为“CropActivity”的类中即可。之后,在您打开“相机”或“图库”以获取图片的活动中,将以下代码放在“ onActivityResult()中“方法:
Intent i = new Intent(AddAChild.this, Crop_Activity.class);
i.putExtra("BitmapImage", filename);
startActivityForResult(i, CROP_RESULT);
就是这样。你很高兴。