我正在使用相机 api 来捕获身份证照片,我有一个叠加层,如下图所示。我想裁剪框中的图像。你能建议一下具体应该如何做吗?我已经写下了我所尝试过的以及它给我的结果。
这是我想要捕获的 id 的屏幕截图..
输出。
白色矩形框是一个相框,位于相对布局的中心
<View
android:id="@+id/photo_frame"
android:layout_width="match_parent"
android:layout_height="212dp"
android:background="@drawable/bg_photo_frame"
android:layout_centerInParent="true"
android:layout_margin="@dimen/double_padding"
android:visibility="visible"/>
Run Code Online (Sandbox Code Playgroud)
如何计算这个帧来剪切图像
这就是我必须剪切需要修改的图像,但不确定前进的方向是什么
public Bitmap cutImage(final Bitmap srcBmp, final int pixepWidth, final int pixelsHeight, float widthRatio) {
// Bitmap croppedBitmap = Bitmap.createBitmap(bitmap, 20, 20, pixepWidth, pixelsHeight);
// return croppedBitmap;
Bitmap dstBmp;
if (srcBmp.getWidth() >= srcBmp.getHeight()){
dstBmp = Bitmap.createBitmap(
srcBmp,
srcBmp.getWidth()/2 - srcBmp.getHeight()/2,
0,
srcBmp.getHeight(),
srcBmp.getHeight()
);
}else{
dstBmp = Bitmap.createBitmap(
srcBmp,
0,
srcBmp.getHeight()/2 - srcBmp.getWidth()/2,
srcBmp.getWidth(),
srcBmp.getWidth()
);
}
return dstBmp;
}
Run Code Online (Sandbox Code Playgroud) android bitmap android-camera android-bitmap android-camera2
我正在尝试根据此处的教程实现一个简单的相机照片捕获应用程序:https://android.jlelse.eu/the-least-you-can-do-with-camera2-api-2971c8c81b8b
该应用程序第一次运行效果很好。预览显示,我可以正确保存照片。
我的问题是,当我关闭应用程序、回击、最小化应用程序等...然后返回相机活动时,预览不再显示任何内容,并且当我尝试拍照时应用程序崩溃。
我几乎肯定我没有以某种方式正确关闭相机,但是与工作实现相比,我已经逐行梳理了我的代码,并且我看不出我在做什么不同/错误的事情。
package com.example.cameratest;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Size;
import android.view.Display;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Toast;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Locale;
public class SecondCamera …Run Code Online (Sandbox Code Playgroud) 下面我想展示我的自定义相机应用程序代码的片段。我的目标是对传入的视频帧应用过滤器并输出它们。为此,我使用 Renderscript 和 Camera2。
这是我的 MainActivity.java (因为它有点长,我删除了处理获取相机权限的方法):
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final int REQUEST_CAMERA_PERMISSION_RESULT = 0;
private TextureView mTextureView;
private Button mButton;
private CameraDevice mCameraDevice;
private String mCameraId;
private HandlerThread mBackgroundHandlerThread;
private Handler mBackgroundHandler;
private Size mPreviewSize;
private CaptureRequest.Builder mCaptureRequestBuilder;
private RsSurfaceRenderer mRenderer;
private Surface mPreviewSurface;
private Surface mProcessingNormalSurface;
private RsCameraPreviewRenderer cameraPreviewRenderer;
private RenderScript rs;
private List<Surface> mSurfaces;
private Toast rendererNameToast;
private String rendererName;
private int currentRendererIndex = 0; …Run Code Online (Sandbox Code Playgroud) 我尝试使用 YUV_420_888 图像格式(我的索尼 XA1 不支持原始数据)通过camera2 API 来近似原始传感器输出。我将所有内容都改为手动并停用了我能找到的所有纠正程序:
mBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_OFF);
mBuilder.set(CaptureRequest.TONEMAP_MODE, CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE);
mBuilder.set(CaptureRequest.TONEMAP_CURVE,
new TonemapCurve(
new float[]{0.0f,0.0f,1.0f,1.0f},
new float[]{0.0f,0.0f,1.0f,1.0f},
new float[]{0.0f,0.0f,1.0f,1.0f}
));
mBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CameraMetadata.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);
mBuilder.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, new ColorSpaceTransform(new int[]{
1, 1, 0, 1, 0, 1,
0, 1, 1, 1, 0, 1,
0, 1, 0, 1, 1, 1
}));
mBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, new RggbChannelVector(1.0f,1.0f,1.0f,1.0f));
mBuilder.set(CaptureRequest.SHADING_MODE, CameraMetadata.SHADING_MODE_OFF);
mBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CameraMetadata.STATISTICS_LENS_SHADING_MAP_MODE_OFF);
mBuilder.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CameraMetadata.CONTROL_AE_ANTIBANDING_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, CameraMetadata.CONTROL_EFFECT_MODE_OFF);
mBuilder.set(CaptureRequest.CONTROL_ENABLE_ZSL, false);
mBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTROL_SCENE_MODE_DISABLED);
mBuilder.set(CaptureRequest.EDGE_MODE, CameraMetadata.EDGE_MODE_OFF);
mBuilder.set(CaptureRequest.HOT_PIXEL_MODE, CameraMetadata.HOT_PIXEL_MODE_OFF);
mBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CameraMetadata.NOISE_REDUCTION_MODE_OFF);
Run Code Online (Sandbox Code Playgroud)
之后,我连拍了 10 张照片,曝光时间线性增加,ISO 为 40。我分析了 …
我想在没有任何 xml 和 PreviewView 或其他用于显示图片的东西的情况下使用 CameraX 拍照,但我有问题。
在相机 1 中,我们有FaceDetectionListener方法camera.startFaceDetection()。使用这种方式可以更容易地找到面孔。
在相机 2 中,我们可以使用 CameraCaptureSession.CaptureCallback() 方法和此静态变量执行相同操作
Integer mode = result.get(CaptureResult.STATISTICS_FACE_DETECT_MODE);
Face[] faces = result.get(CaptureResult.STATISTICS_FACES);
Run Code Online (Sandbox Code Playgroud)
现在有一个名为 CameraX 的新相机库。它是Camera2的包装,推荐使用。如果是Camera 2的封装,我们可以很容易得到如下的回调结果CameraCaptureSession.CaptureCallback()
但经过三天的尝试,我未能找到解决方案。
谁能给我像camera2一样调用以下方法的解决方案?
在相机2中,
private val mCaptureCallback = object : CameraCaptureSession.CaptureCallback() {
override fun onCaptureProgressed(
session: CameraCaptureSession,
request: CaptureRequest,
partialResult: CaptureResult
) {
}
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
}
}
mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback,
mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)
如何使用CameraX获取回调结果?
根据此文档,某些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头。我检查了大约 10 部三星手机(Galaxy Tab S4/7、Galaxy A71、Galaxy S10e)。它们都没有 FEATURE_CAMERA_EXTERNAL。
if(packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_EXTERNAL)) {
Log.v("TestApp", "Supports external camera")
}
else {
Log.v("TestApp", "Doesnt support external camera")
}
Run Code Online (Sandbox Code Playgroud)
有谁知道哪些设备支持FEATURE_CAMERA_EXTERNAL?
我正在使用Camera2 扩展示例进行实时图像处理。在此之前我使用的是Camera2 Basic。在基本示例中,我从下面的代码片段中获取实时图像。
val captureRequest = camera.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW
).apply {
addTarget(getViewDataBinding()?.viewFinder!!.holder.surface)
addTarget(imageReader.surface)
}
// This will keep sending the capture request as frequently as possible until the
// session is torn down or session.stopRepeating() is called
captureRequest.set(
CaptureRequest.CONTROL_MODE,
CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE
)
captureRequest.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
session.setRepeatingRequest(captureRequest.build(), null, cameraHandler)
Run Code Online (Sandbox Code Playgroud)
你可以看到,我在上面的代码中添加了目标imageReader。我使用扩展 API 几乎类似的方式。但是在ExtensionSessionConfiguration配置方法中。
cameraExtensionSession = session
try {
val captureRequest = camera.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW
).apply {
addTarget(previewSurface)
addTarget(imageReader.surface)
}
captureRequest.set(
CaptureRequest.CONTROL_MODE,
CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE
)
cameraExtensionSession.setRepeatingRequest(
captureRequest.build(),
Dispatchers.IO.asExecutor(), captureCallbacks
) …Run Code Online (Sandbox Code Playgroud) java android image-processing android-camera android-camera2
我正在关注在Android应用程序中使用相机的教程.我在模拟器和物理设备上运行调试时收到错误"权限拒绝:无法使用相机".我在清单文件中尝试了各种权限.似乎大多数有此错误的人都有错误,缺少权限或权限不在其清单中的正确位置.
这是我的清单文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.karudo.dbzrealpowerup" >
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera2" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".DBZHome"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DBZStartPowerUp"
android:label="@string/title_activity_dbzstart_power_up" >
</activity>
</application>
</manifest>
Run Code Online (Sandbox Code Playgroud)
这是我的活动:
package com.example.karudo.dbzrealpowerup;
import android.app.Activity;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Bundle;
import android.util.Size;
import android.view.Menu;
import android.view.MenuItem;
import android.view.TextureView;
import android.widget.Toast; …Run Code Online (Sandbox Code Playgroud) 我使用了我的Fabric服务,并在运行我的应用程序的大多数设备上发现了此错误.
错误是这样的:
致命异常:java.lang.NullPointerException尝试在空对象引用上调用虚拟方法'android.hardware.Camera $ Parameters android.hardware.Camera.getParameters()'
这是我的代码:
public class CameraActivity extends Activity implements SurfaceHolder.Callback{
android.hardware.Camera camera;
int moi = 0;
@InjectView(R.id.s)
SurfaceView surfaceView;
@InjectView(R.id.takeaphoto)
ImageView imageView;
SurfaceHolder surfaceHolder;
private Camera.Face[] mFaces;
// Draw rectangles and other fancy stuff:
private FaceOverlayView mFaceView;
private int mOrientation;
private float x1,x2;
static final int MIN_DISTANCE = 150;
private int mOrientationCompensation;
private OrientationEventListener mOrientationEventListener;
// Let's keep track of the display rotation and orientation also:
private int mDisplayRotation;
private int mDisplayOrientation;
Camera.PictureCallback callback; …Run Code Online (Sandbox Code Playgroud)