我想拍照,并使用CameraX从中心裁剪出25x25 dp的正方形。我已经读到可以使用ImageCapture进行裁剪,但不幸的是,到目前为止,几乎没有类似的示例。
val imageCaptureConfig = ImageCaptureConfig.Builder().apply {
setTargetAspectRatio(Rational(1, 1))
setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
}.build()
val imageCapture = ImageCapture(imageCaptureConfig)
btn_take_photo.setOnClickListener {
imageCapture.takePicture(
object : ImageCapture.OnImageCapturedListener() {
override fun onCaptureSuccess(image: ImageProxy?, rotationDegrees: Int) {
super.onCaptureSuccess(image, rotationDegrees)
// image manipulation here?
}
}
)
}
答案 0 :(得分:2)
您可以在捕获图像后使用此功能裁剪图像:
private fun cropImage(bitmap: Bitmap, frame: View, reference: View): ByteArray {
val heightOriginal = frame.height
val widthOriginal = frame.width
val heightFrame = reference.height
val widthFrame = reference.width
val leftFrame = reference.left
val topFrame = reference.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()
}
以参考图像的形式裁剪图像,像是框架的父视图,而像最终参考的子视图则是
bitmap
要裁剪的图像frame
设置图像的位置reference
框架为裁剪图像提供参考return
图像已经裁剪答案 1 :(得分:1)
您可以将图像转换为位图,然后进行裁剪。
Bitmap cropImage(Image image, int rotationDegree, int xOffset, int yOffset, int cropWidth, int cropHeight) {
// 1 - Convert image to Bitmap
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
// 2 - Rotate the Bitmap
if(rotationDegree != 0) {
Matrix rotationMatrix = new Matrix();
rotationMatrix.postRotate(rotationDegree);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), rotationMatrix, true);
}
// 3 - Crop the Bitmap
bitmap = Bitmap.createBitmap(bitmap, xOffset, yOffset, cropWidth, cropHeight);
return bitmap;
}
答案 2 :(得分:0)
您可以从图像中获取飞机并手动裁剪它们:
private fun cropByteArray(array : ByteArray, cropRect: Rect): ByteArray {
val croppedArray = ByteArray(cropRect.width()*cropRect.height())
val imageWidth = 640
var i = 0
array.forEachIndexed { index, byte ->
val x = index % imageWidth
val y = index / imageWidth
if (cropRect.left <= x && x < cropRect.right && cropRect.top <= y && y < cropRect.bottom) {
croppedArray[i] = byte
i++
}
}
return croppedArray
}
......
val buffer = image.planes[0].buffer
val imageByteArray = buffer.toByteArray()
val data = cropByteArray(imageByteArray, cropRect)