- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何从Android手机拍照时获取AutoExposureCompensation级别(亮度)?
我可以拍照。我可以访问相机的参数,包括曝光补偿(检查时始终为零),但我需要在拍摄照片时获得 AE 补偿级别,而不是之前和之后。
背景:我希望在特定时间拍摄的所有照片都使用与拍摄照片相同的 AE 补偿级别。我不希望 Android 相机通常对曝光级别或白平衡进行数百次调整。我想获得一次,并为所有后续照片设置相同的设置。
我尝试过对图片、OpenCV、 fragment 等使用“intents”。我似乎无法使用其中任何一个获得 AE 补偿设置。这是我尝试过的最新代码,从扩展版本的 JavaCameraView 开始:
import org.opencv.android.JavaCameraView;
import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.Size;
import android.util.AttributeSet;
import android.util.Log;
@SuppressWarnings("deprecation")
public class NewJavaCameraView extends JavaCameraView implements PictureCallback {
public int getExposureCompensation(){
return mCamera.getParameters().getExposureCompensation();
}
@SuppressWarnings("deprecation")
public void takePicture(final String fileName) {
Log.i(TAG, "Taking picture");
this.mPictureFileName = fileName;
Camera.Parameters params = mCamera.getParameters();
int exposureComp = params.getExposureCompensation();
mCamera.setPreviewCallback(null);
// PictureCallback is implemented by the current class
int otherexposureComp =this.getExposureCompensation();
mCamera.takePicture(null, null, this);
}
@SuppressWarnings("deprecation")
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Camera.Parameters params = mCamera.getParameters();
int exposureComp = params.getExposureCompensation();
int otherexposureComp =this.getExposureCompensation();
mCamera.startPreview();
mCamera.setPreviewCallback(this);
// Write the image in a file (in jpeg format)
try {
FileOutputStream fos = new FileOutputStream(mPictureFileName);
fos.write(data);
fos.close();
} catch (java.io.IOException e) {
Log.e("Picture", "photoCallback", e);
}
}
下面是使用上述类的 Android View 中的一些代码:
public class DiscPhoto extends Activity implements CvCameraViewListener2, OnTouchListener {
private static final String TAG = "OCVSample::Activity";
private NewJavaCameraView mOpenCvCameraView;
private List<Size> mResolutionList;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
mOpenCvCameraView.setOnTouchListener(DiscPhoto.this);
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
public DiscPhoto() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_disc_photo);
mOpenCvCameraView = (NewJavaCameraView) findViewById(R.id.discPhotoPage);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
}
@SuppressLint("SimpleDateFormat")
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(TAG,"onTouch event");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String currentDateandTime = sdf.format(new Date());
String fileName = Environment.getExternalStorageDirectory().getPath() +
"/sample_picture_" + currentDateandTime + ".jpg";
mOpenCvCameraView.takePicture(fileName);
Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show();
return false;
}
最佳答案
我认为 camera2 API ( https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.html) 可以满足您的需求。
Source: https://developer.android.com/reference/android/hardware/camera2/CaptureRequest.html#CONTROL_AE_LOCK
Since the camera device has a pipeline of in-flight requests, thesettings that get locked do not necessarily correspond to the settingsthat were present in the latest capture result received from thecamera device, since additional captures and AE updates may haveoccurred even before the result was sent out. If an application isswitching between automatic and manual control and wishes to eliminateany flicker during the switch, the following procedure is recommended:
- Starting in auto-AE mode:
- Lock AE
- Wait for the first result to be output that has the AE locked
- Copy exposure settings from that result into a request, set the request to manual AE
- Submit the capture request, proceed to run manual AE as desired.
也根据AE模式的描述(同源)
When set to any of the ON modes, the values chosen by the cameradevice auto-exposure routine for the overridden fields for a givencapture will be available in its CaptureResult.
因此,一旦您发出第一个 CaptureRequest,就可以使用来自以下回调的 TotalCaptureResult
:
void onCaptureCompleted (CameraCaptureSession session,
CaptureRequest request,
TotalCaptureResult result)
{
int aecompensationlevel = result.get(CaptureResult.CONTROL_AE_EXPOSURE_COMPENSATION)
}
关于java - 拍照时如何通过Java从Android手机相机获取曝光补偿级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41934633/
在德国,移动运营商通常会提供一种简单的方法来配置您的手机的 MMS 和 GPRS:在运营商的网站上输入您的电话号码和设备型号后,您会收到一条发送给您的“配置短信”。 我试图从技术角度理解它是如何工作的
我正在开发一个非常复杂的应用程序。它针对手机和平板电脑有不同的布局,我不知道最好的方法。 我听说您可以发布两个不同的应用程序,一个用于移动设备,另一个用于平板电脑,但人们不推荐它。 我应该用两个不同的
我不确定这个问题属于这里....但仍然.... 我的应用程序每 3 分钟与服务器交换一次数据。我在手机覆盖范围内使用蜂窝平板电脑(不是 Wi-Fi)。如果一个人在没有手机覆盖的地方使用它,他将不会获得
我有这样的 CSS: .editTable-body { width: 100%; height:140px; margin-top: 20px; overflow:
我有这个链接,它在移动设备上被设计为按钮,我面临的问题是它在手机和平板电脑上看起来不同。这是因为设备分辨率还是我应该通过 CSS 修复的问题。这是我当前的 CSS CSS border-radiu
大家好,我一个月前开始学习网络开发,但我遇到了背景图片无法在移动设备上正确显示的问题。 我正在使用下面的模板,甚至这个模板也有同样的问题。 问题只是背景图像在移动设备上放大,而不是相应地与屏幕尺寸成比
我一直在尝试为我的网站制作一个导航栏,但是当我移动它时,我导航栏中的列表移动了 40 像素到计算机屏幕的右侧,那里没有任何东西。 你能帮帮我吗? 最佳答案 在您的导航栏样式中,将导航栏的宽度设置为 1
一周以来,我一直不明白为什么我的网站被设计成响应式的,一切正常吗?笔记本电脑即使放在小尺寸的情况下也能完美运行,然后进入我的手机却没有响应。 我试过卸载插件,我更改了主题,但找不到原因。 你能抱住我吗
我在 my website 上实现了以下字体. /* Vivaldi Font */ @font-face { font-family: 'vivaldi'; src: url('as
我正在使用 Angular 4 并构建一个应用程序。它工作正常,但当我在移动设备上运行时出现问题。整个风格发生了变化并分发了整个应用程序。我担心我必须做什么。任何帮助将不胜感激 最佳答案 在表格前取
我目前使用的是 HTC Wildfire 手机的接近传感器。问题在于,如果传感器前方 1 厘米范围内有物体,它只会返回一个 bool 值。 所以,我想问一下市场上是否有一款 Android 手机具有接
根据 this Android C2DM 通过心跳机制使套接字保持 Activity 状态,使其能够接收推送消息。这让我希望我可以通过活跃的 wifi 连接向休眠手机发送消息。 我已经将“delay_
我不希望小型设备的边缘有任何空白。当屏幕已经很小时,使用除屏幕全宽之外的任何东西都会适得其反。 所以我通过wordpress使用了一个主题,但我想出了容器div并且能够修改它,我想让它更窄。 我还声明
有谁知道这些设备之一是否连接到网络,是否可以从 header 或其他方式读取其电话号码? 最佳答案 电话号码不会出现在 HTTP header 中。您的 IP 地址将对网络服务器可见,仅此而已。 编辑
我在使用以下步骤在 android 设备上设置设备所有者时遇到错误。这过去在其他设备上也有效: 执行恢复出厂设置 在设备上启用 Debug模式 从命令行在连接的设备上运行以下命令: adb insta
有人尝试在 Windows Phone 7.1 (RC) 上使用 Udp 单播吗?我有几个问题想问你们。 根据文件http://msdn.microsoft.com/en-us/library/sys
我正在制作一个游戏(仅使用 eclipse 和 android sdk),并且我有一个基于文本文件输入的关卡构建功能。 例如,“levelone.txt”可能包含“[2,5],[14,7],[10,9
我听说要测试 Android 应用程序,您必须在 2 部不同的手机上进行测试(取决于分辨率)推荐哪些手机? 最佳答案 我还建议在一台配备“纯”Android 的设备上进行测试,并且至少在另一台配备 H
我正在使用蓝牙设备手动连接 Android 手机,没有问题。但我的问题是当我启动 Activity 或应用程序时如何自动连接。 我正在引用示例 API 中的蓝牙聊天进行连接。 http://devel
我知道我可以使用 uri 在页面之间传递值,例如: NavigationService.Navigate( new Uri("/DestinationPage.xaml?parameter1=v1",
我是一名优秀的程序员,十分优秀!