在android中裁剪后保存图像
Posted
技术标签:
【中文标题】在android中裁剪后保存图像【英文标题】:save image after cropping in android 【发布时间】:2014-11-03 17:18:19 【问题描述】:我正在尝试保存裁剪后的图像,并且已成功保存,但问题是保存的图像太小。我想获得裁剪图像的原始尺寸。这是我保存裁剪图像的代码。
Bundle extras = data.getExtras();
if (extras != null)
Bitmap photo = extras.getParcelable("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.PNG, 100, bytes);
File f = new File(fileUri.getPath());
try
f.createNewFile();
FileOutputStream fo = new FileOutputStream(f);
fo.write(bytes.toByteArray());
fo.close();
catch (IOException e)
e.printStackTrace();
任何人都可以帮助我获得高质量的裁剪图像。任何帮助将非常感激。谢谢:)
【问题讨论】:
你正在保存你得到的东西;具有该格式的最高质量。那里没什么可改进的。 我见过很多应用有高质量的裁剪图片,应该有办法的。 【参考方案1】:这完全取决于原始图像的大小和您将图像裁剪成的大小。
一种裁剪方式是这样的:
Intent photoPickerIntent = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
photoPickerIntent.putExtra("scaleType", "centerCrop");
photoPickerIntent.putExtra("crop", "true");
photoPickerIntent.putExtra("aspectX", 1);
photoPickerIntent.putExtra("aspectY", 1);
//....snip....
photoPickerIntent.putExtra("outputX", 400);
photoPickerIntent.putExtra("outputY", 400);
//....snip....
photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, getBackgroundUri());
photoPickerIntent.putExtra("outputFormat",Bitmap.CompressFormat.JPEG.toString());
startActivityForResult(photoPickerIntent, ActivityCrop);
这样,您总是会得到一个大小为 400 像素(输出 = 400)的方形图像(纵横比 = 1)。 因此,如果您选择图像的 800 像素正方形,它将按比例缩小,从而降低质量。 相反,选择 50px 的正方形也会得到 400px 的结果。
现在,如果您取消大小限制(就在虚线处)。您将获得最初选择的区域(示例中为 800 和 50)并获得最佳质量。
【讨论】:
我怎样才能消除尺寸限制? 它们位于两个“snip”cmets 之间。额外的“outputX”和“outputY”设置此意图的输出大小。 额外的“outputX”和“outputY”的大小应该是多少,以消除大小限制。感谢您的回复,非常感谢:) 我的意思是完全省略这两行代码。这样您就可以准确地获得您在裁剪期间选择的内容。【参考方案2】:发送带有纵横比和大小的裁剪意图
Intent cropIntent = new Intent("com.android.camera.action.CROP");
cropIntent.setDataAndType(picUri, "image/*");
cropIntent.putExtra("crop", "true");
cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);
cropIntent.putExtra("outputX", 256);
cropIntent.putExtra("outputY", 256);
cropIntent.putExtra("return-data", true);
startActivityForResult(cropIntent, PIC_CROP);
关于活动结果
if (requestCode == PIC_CROP)
Bundle extras = data.getExtras();
Bitmap thePic = extras.getParcelable("data");
BitmapDrawable drawable = (BitmapDrawable) i1.getDrawable();
Bitmap bb11 = drawable.getBitmap();
File sdCardDirectory = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"MFA - AFTER - CROP");
if (!sdCardDirectory.exists())
if (!sdCardDirectory.mkdirs())
Log.d("MySnaps", "failed to create directory");
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
.format(new Date());
String nw = "MFA_CROP_" + timeStamp + ".jpeg";
File image = new File(sdCardDirectory, nw);
boolean success = false;
// Encode the file as a PNG image.
FileOutputStream outStream;
try
outStream = new FileOutputStream(image);
bb11.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
/* 100 to keep full quality of the image */
outStream.flush();
outStream.close();
success = true;
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
b7.setEnabled(true);
快乐编码:)
【讨论】:
atline BitmapDrawable drawable = (BitmapDrawable) i1.getDrawable(); i1 是什么? i1 是我在编码中使用的 imageview 。这只是想知道该怎么做。 完美运行,不知道为什么你没有被支持。谢谢卡西尔【参考方案3】:这是我的代码
intent.setData(mImageCaptureUri);
intent.putExtra("crop", "true");
intent.putExtra("outputX", 320);
intent.putExtra("outputY", 470);
intent.putExtra("aspectX", 320);
intent.putExtra("aspectY", 470);
intent.putExtra("scale", true);
intent.putExtra("return-data", true);
来自本站
Screen resolution for different devices
【讨论】:
以上是关于在android中裁剪后保存图像的主要内容,如果未能解决你的问题,请参考以下文章
裁剪图像并保存到 sdcard (Android) 中的特定文件夹?