使用四个(x,y)坐标如何裁剪图像

6
在我的应用程序中,我将使用四个(x,y)坐标来裁剪图像,并且我还需要在另一个活动屏幕上显示裁剪后的图像。例如,在下面的图像中,我想要裁剪白色图层本身。因此,任何人都可以提供解决此技术在我的项目中实现的方法。
2个回答

10

使用Bitmap类的实例,您可以使用Bitmap.createBitmap()方法,通过传递原始图像的x,y坐标(左上角),然后是宽度和高度来创建位图。

查看此处的文档。

在您的原始示例中,它将是:

Bitmap newBitmap=Bitmap.createBitmap(oldBitmap,10,20,70,80);

编辑

Bitmap类还允许您访问表示颜色的像素int数组。如果您知道要裁剪的形状的坐标,可以遍历数组并将超出形状范围的像素alpha设置为完全不透明。



@ ellipsis,你的代码仅适用于矩形大小剪裁,但实际上我需要使用四个坐标来剪裁图像,其形状不仅限于矩形,它基于四个点(四边形)而变化。 - Manoj
所以你想要一个菱形裁剪,例如?请参见编辑。 - Michael Kent

1

我已经在我的一个应用程序中完成了这样的功能。请检查下面的代码,了解如何从相机裁剪捕获的图像。

val bytes = cropImage(capturedBitmap!!, viewBinding.viewFinder, viewBinding.containerOverly)

val croppedImage = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)

private fun cropImage(bitmap: Bitmap, containerImage: View, containerOverlay: View): ByteArray {
    val heightOriginal = containerImage.height
    val widthOriginal = containerImage.width
    val heightFrame = containerOverlay.height
    val widthFrame = containerOverlay.width
    val leftFrame = containerOverlay.left
    val topFrame = containerOverlay.top
    val heightReal = bitmap.height
    val widthReal = bitmap.width
    val widthFinal = widthFrame * widthReal / widthOriginal
    val heightFinal = heightFrame * heightReal / heightOriginal
    val leftFinal = leftFrame * widthReal / widthOriginal
    val topFinal = topFrame * heightReal / heightOriginal
    val bitmapFinal = Bitmap.createBitmap(
        bitmap,
        leftFinal, topFinal, widthFinal, heightFinal
    )
    val stream = ByteArrayOutputStream()
    bitmapFinal.compress(
        Bitmap.CompressFormat.JPEG,
        100,
        stream
    ) //100 is the best quality possibe
    return stream.toByteArray()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接