基于Camera2Basic程序代码,我想放大预览图像拐角处的特定区域。
在F-05J(Android7.1)上,裁剪区域始终围绕预览图像的中心。 我想知道为什么。
我的缩放程序很容易在预览图像的中心周围工作。 我在我的TextureView侦听器的onTouch回调中应用了一些确定的参数,以便了解缩放的方式和位置。
在Nexus 5X上,它似乎在拐角处放大,但是裁剪区域的原始点似乎在旋转的水平矩形的右下角。我希望图像顺时针旋转270度,并且原点位于左上角。 我想知道为什么。 在Nexus 5X上,传感器方向为270度。 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL不是LEGACY,LIMITED和FULL中的任何一个。
尝试使用JPEG格式和ImageReader的YUV_420_888格式。
如果将作物区域设置为较小,则它将扩大较小区域。 activity.getWindowManager()。getDefaultDisplay()。getRotation()的值为0 F-05J上的传感器方向为90度。 CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL为旧版
后来,我找到了CameraCharacteristics参数SCALER_CROPPING_TYPE。 如果设备为LEGACY,则不支持FREEFORM类型,它将在活动阵列的中心附近裁剪。
public boolean onTouch(View view, MotionEvent motionEvent) {
if(view != mTextureView) return false;
try {
Rect rect = mCameraCaracteristics.get(
CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
if (rect == null) return false;
float currentFingerSpacing;
if (motionEvent.getPointerCount() == 2) { //Multi touch.
currentFingerSpacing = getFingerSpacing(motionEvent);
float delta = 0.05f;
if (fingerSpacing != 0) {
if (currentFingerSpacing > fingerSpacing) { //zoom-in
if ((maximumZoomLevel - zoomLevel) <= delta) {
delta = maximumZoomLevel - zoomLevel;
}
zoomLevel = zoomLevel + delta;
} else if (currentFingerSpacing < fingerSpacing){
if ((zoomLevel - delta) < 1f) {
delta = zoomLevel - 1f;
}
zoomLevel = zoomLevel - delta;
}
Rect zoom = new Rect();
//for example, want to zoom in on the right top
int centerx = 3500; int centery = 500;
int width = 600;
int height = 800;
//adjust the corner points
zoom.left=(int)centerx-width/2;
if(zoom.left<0) zoom.left=0;
zoom.top=(int)centery-height/2;
if(zoom.top < 0) zoom.top=0;
zoom.right=(int)centerx+width/2;
zoom.bottom=(int)centery+height/2;
if(zoom.right>rect.width()) zoom.right=rect.width();
if(zoom.bottom>rect.height()) zoom.bottom=rect.height();
mPreviewRequestBuilder.set(
CaptureRequest.SCALER_CROP_REGION, zoom);
}
fingerSpacing = currentFingerSpacing;
} else { //Single touch point
return true;
}
mCaptureSession.setRepeatingRequest(
mPreviewRequestBuilder.build(),mCaptureCallback, null);
return true;
} catch(Exception e)
{
e.printStackTrace();
return true;
}
我希望特定点附近的作物区域能够正常工作。