【问题标题】:How to crop an image in android? [duplicate]如何在android中裁剪图像? [复制]
【发布时间】:2010-10-02 15:20:26
【问题描述】:

可能重复:
How to crop the parsed image in android?

我的 res/drawable 文件夹中有一个图像,我想在将图像加载到 ImageView 时裁剪(即切掉图像的某些部分)。但是我不确定如何做到这一点,有什么建议吗?

【问题讨论】:

  • 链接的问题答案不回答如何裁剪,请阅读。
  • 我发现裁剪图像的最佳库是Android-Image-Cropper。看到这个answer

标签: android


【解决方案1】:

来自Bitmap.createBitmap: “从源位图的指定子集中返回一个不可变位图。新位图可能与源位图是同一对象,或者可能已制作副本。它以与原始位图相同的密度进行初始化。”

向它传递一个位图,并定义从中创建新位图的矩形。

// Take 10 pixels off the bottom of a Bitmap
Bitmap croppedBmp = Bitmap.createBitmap(originalBmp, 0, 0, originalBmp.getWidth(), originalBmp.getHeight()-10);

【讨论】:

  • 对我来说,只有当我执行originalBmp.getWidth()-1 时它才有效。似乎所有裁剪尺寸都必须完全落在原件内,否则原件会被退回。
  • 这应该被接受,很简单。
【解决方案2】:

Android 联系人管理器EditContactActivity 使用Intent("com.android.camera.action.CROP")

这是一个示例代码:

Intent intent = new Intent("com.android.camera.action.CROP");
// this will open all images in the Galery
intent.setDataAndType(photoUri, "image/*");
intent.putExtra("crop", "true");
// this defines the aspect ration
intent.putExtra("aspectX", aspectY);
intent.putExtra("aspectY", aspectX);
// this defines the output bitmap size
intent.putExtra("outputX", sizeX);
intent.putExtra("outputY", xizeY);
// true to return a Bitmap, false to directly save the cropped iamge
intent.putExtra("return-data", false);
//save output image in uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

【讨论】:

  • 如果我在 SD 卡/myimage.jpg 中有图像,如何将 URI 放入 CROP 意图? IE。我想裁剪 SD 卡/myimage.jpg 图像的一个区域。
  • #Nguyen,你评论了什么。
  • @rds,我可以使用上面的代码裁剪图像,但是相机裁剪活动仍在我的应用程序之外运行,当用户在裁剪意图中按下保存或取消时,如何完成该意图跨度>
  • 当然它在你的应用程序之外运行。阅读意图: 1. 它在处理com.android.camera.action.CROP 的应用程序中运行。 2. 输出保存在您指定的uri 中。最后一件事:使用startActivityForResult 启动此活动,以了解用户是按下确定还是取消。
  • 这种方法意味着您必须具有访问文件夹的权限,并且在 kti kat 及更高版本中需要添加文档权限。如果我没记错的话
【解决方案3】:

试试这个:

ImageView ivPeakOver=(ImageView) findViewById(R.id.yourImageViewID);

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.yourImageID);
int width=(int)(bmp.getWidth()*peakPercent/100);
int height=bmp.getHeight();

Bitmap resizedbitmap=Bitmap.createBitmap(bmp,0,0, width, height);
ivPeakOver.setImageBitmap(resizedbitmap);

来自文档:

static Bitmap    createBitmap(Bitmap source, int x, int y, int width, int height)

从源位图的指定子集中返回不可变位图。

【讨论】:

  • 不错!仍然很傻,虽然不能用 ImageView 上的简单属性来完成,但我想这应该足够有效。
【解决方案4】:

如果你想同样裁剪图像的外部,你应该检查 ImageView 的 ScaleType 属性:http://developer.android.com/reference/android/widget/ImageView.ScaleType.html

您尤其会对“centerCrop”选项感兴趣。它会裁剪掉大于定义尺寸的图像部分。

这是在 XML 布局中执行此操作的示例:

<ImageView  android:id="@+id/title_logo"
            android:src="@drawable/logo"
            android:scaleType="centerCrop" android:padding="4dip"/>

【讨论】:

  • 太傻了,他们没有添加更多的裁剪选项然后居中裁剪......
【解决方案5】:
 int targetWidth = 100;
 int targetHeight = 100;
 RectF rectf = new RectF(0, 0, 100, 100);//was missing before update
 Bitmap targetBitmap = Bitmap.createBitmap(
 targetWidth, targetHeight,Bitmap.Config.ARGB_8888);
 Canvas canvas = new Canvas(targetBitmap);
 Path path = new Path();
 path.addRect(rectf, Path.Direction.CW);
 canvas.clipPath(path);
 canvas.drawBitmap(
 sourceBitmap,
 new Rect(0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight()),
 new Rect(0, 0, targetWidth, targetHeight),
 null);
 ImageView imageView = (ImageView)findViewById(R.id.my_image_view);
 imageView.setImageBitmap(targetBitmap);

【讨论】:

  • 您将路径设置为矩形“rectf”,但没有定义它。您如何计算剪切矩形的尺寸以正确剪切位图的中心? IE。不要从角落里剪掉。
  • 除非您需要进一步修改位图,否则使用获取源图像的​​ Bitmap.createBitmap 的方法应该更有效。由于它创建了一个不可变的位图,因此不必制作副本。 (除非源是可变的)
  • 什么是rectf?请回复
  • 此代码适用于缩放图像而不是裁剪!
猜你喜欢
  • 2015-02-02
  • 2021-07-24
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多