- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 Camera 1 API 构建了一个自定义相机,由于某种原因,它生成了非常暗的图片(仅在前置摄像头上,后置摄像头工作得很好)。相机预览以正确的亮度显示相机应有的样子 - 只有当图像被捕获并解码为位图时,它才会看起来真的暗。我疯狂地用谷歌搜索了一段时间,发现这个问题被报告了好几次,但找不到有效的解决方案。我使用的设备是三星 J5。
相机预览:
class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static final String CAMERA = "CAMERA";
private static Camera mCamera;
private final CameraActivity cameraActivity;
private final SurfaceHolder mHolder;
public CameraPreview(Camera camera, CameraActivity cameraActivity) {
super(cameraActivity);
this.cameraActivity = cameraActivity;
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void setCameraDisplayOrientation(int cameraId) {
Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
Camera.getCameraInfo(cameraId, info);
final int rotation = cameraActivity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0:
degrees = 0;
break;
case Surface.ROTATION_90:
degrees = 90;
break;
case Surface.ROTATION_180:
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result;
if (info.facing == cameraId) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
} else {
result = (info.orientation - degrees + 360) % 360;
}
mCamera.setDisplayOrientation(result);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
cameraActivity.isSafeToTakePicture(true);
Camera.Parameters params = mCamera.getParameters();
// my attempt at preventing darkness
params.setExposureCompensation(params.getMaxExposureCompensation());
if(params.isAutoExposureLockSupported()) {
params.setAutoExposureLock(false);
}
mCamera.setParameters(params);
} catch (IOException e) {
Log.d(CAMERA, "An error occured when setting up the camera preview " + e.getMessage());
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPreview();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
}
}
在我的 CameraPictureCallback
上(拍摄图像时),我将字节发送到此方法,该方法将字节解码为位图,将其放入一个包中并将其传递给下一个 fragment :
public void openFragmentWithBitmap(byte[] bytes) {
final BitmapFactory.Options scalingOptions = new BitmapFactory.Options();
final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, scalingOptions);
final Bundle bundle = new Bundle();
bundle.putParcelable(SELFIE, bitmap);
mCamera.stopPreview();
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
final Fragment startChainFragment = new StartChainFragment();
startChainFragment.setArguments(bundle);
ft.setCustomAnimations(R.anim.slide_up, R.anim.slide_down)
.replace(R.id.rlPlaceholder, startChainFragment, StartChainFragment.TAG)
.addToBackStack(null)
.commit();
}
我是不是漏掉了什么技巧?在我的 surfaceCreated() 中,我将曝光补偿设置为最大值,但这似乎没有效果。感谢任何帮助。
编辑:事实证明,添加延迟并没有什么不同,所以这里是结果(相机预览与实际拍摄的图像):
当点击捕获按钮时,通过调用 mCamera.takePicture(null, null, pictureCallback)
捕获图像(回调只是将字节传输到上述方法)。
最佳答案
在经历了所有的鲜血、汗水和泪水之后,我找到了解决方案。我注意到预览图片和最终图片看起来分辨率不同(您可以看到预览图片中的瓶子比捕获的图片宽)。所以我试图让它们相同或尽可能接近。我在 surfaceCreated()
中的 startPreview()
之后调用此方法:
private void loadCameraParameters() {
final Camera.Parameters camParams = mCamera.getParameters();
final Camera.Size previewSize = getOptimalPreviewSize(camParams.getSupportedPreviewSizes(), screenWidth, screenHeight);
camParams.setPreviewSize(previewSize.width, previewSize.height);
final Camera.Size pictureSize = getOptimalPreviewSize(camParams.getSupportedPictureSizes(), screenWidth, screenHeight);
camParams.setPictureSize(pictureSize.width, pictureSize.height);
mCamera.setParameters(camParams);
}
其中 getOptimalPreviewSize()
是:
private Camera.Size getOptimalPreviewSize(List<Size> sizes, int targetWidth, int targetHeight) {
final double aspectTolerance = 0.05;
final double targetRatio = (double) targetWidth/targetHeight;
if (sizes == null) {
return null;
}
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
final double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > aspectTolerance) continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}
现在我的图片和预览在我的两台设备上都完美匹配,具有相同的亮度和分辨率。
关于java - 相机预览很好,但前置相机产生的照片非常暗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53584614/
下类时合上笔记本电脑。当我回到家并打开它时,它已重新启动。现在,当我打开 Titanium Developer 时,它会立即崩溃。 所以我现在也打不开。关于如何调试或找出问题所在的任何想法? 甚至尝试
我们想共享运行时项目二进制文件。所以每个团队成员都可以使用当前的工作版本。 在 SVN 中存储运行时二进制文件是否可以接受/很好? 最佳答案 不,不要将二进制文件存储在其源代码旁边(除非您有充分的理由
我在 PHP 中使用循环来显示 CMS 管理部分中的用户数据。每行(用户)都包含一些我想要连接到命令的图标(例如:编辑、删除等)。表的最后一行有空的输入字段,带有单个图标(命令),以允许添加新用户。这
如果这是一个新手问题,请原谅我,我昨天开始学习 Django,并且我尽量不要养成坏习惯,即我试图从一开始就以“django 方式”做事。 我有一个 View 接收二进制数据作为 http post 字
使用 swift 2.1 我正在寻找一种将非可选类型数组分配给可选类型数组的好方法,其中类型相同。这是我尝试过的一些方法: var foos: [Int?] = [] let bars: [Int]
James Gosling,加拿大计算机科学家,完成了 Java 的原始设计,并实现了 Java 最初版本的编译器和虚拟机,也是公认的 “Java 之父”。 Evrone 是一家企业软件开发公司,
我在两个项目上使用 Twitter Bootstrap,一个是静态 HTML 网站,另一个是 Rails 应用程序。当我在桌面浏览器上测试网站时,调整大小有效。但是当我在手机 [Nokia E72]
我可以使用全日历。但我有一个侧边栏,用户可以折叠它,然后内容框会变大,但是当用户这样做时,日历就不那么好了。 所以我正在考虑窗口调整大小功能,但这仅在浏览器窗口更改时才有效,那么当容器变大或变小时如何
我正在尝试使用 C# 和 LINQ 在数据库中查询每日活跃用户。我有一个运行良好的 SQL 查询。它在 u.UserId).Distinct().Count() } 测试后,当我必须选择 (
我目前正在开发部署目标为 7.1 的 iOS 应用程序。我的大部分测试都是在 iOS8 环境中执行的,没有任何问题。我连接了一个 iOS7 (5s) 测试设备,发现通过手机显示的 View 是 3.5
我有这样的代码: Floating left. Floating right. BlahBlah Container 允许我将页脚推到页面底部,但如果我想让左右栏跨越接触页脚的高度
从 PHP4 和 Cake 1.3 开始,我一直在使用 debug($data);在 CakePHP 中调试诸如模型输出之类的东西。 但是,自从升级到 PHP5.4 后,我注意到 debug($dat
我在Canvas上画我的游戏,一切都是上帝,但我把它改成了JPanel,但现在它不能正常工作,这是代码,你可以复制它们,你就会看到问题出在哪里(我有一个菜单,单击按钮后它应该创建新线程,我想在那里画画
我尝试用 scrapy 抓取一页。我用 FireXpath(一个 firefox 插件)找到了 xpath,它看起来不错。但是对于 Scrapy,我没有得到任何结果。 我的 python 程序如下所示
我想在页面加载时加载 fancybox。它工作正常,但我对它的高度有疑问。假设页面的高度为 3000px,而 fancybox 的高度为 1500px。如果你想看到页面的最低部分,都应该向下滚动。不幸
IE 大小调整问题!?代码非常简单:我有一个 div,我想要一个占 DIV 100% 的文本框。它必须显示 div 的红线(如果我使用 height:100%, width:100% 它会侵 ecli
我有一组看起来像这样的代码: if(self.property == A) { [self.infoManager getThingA:^(NSString *thing, NSError *
我认为 git clone 使用 STDERR。 我现在想将它重定向到 STDOUT 以使用此 hack . 我遇到了一些问题(另外,我使用很棒的 stderred 库自动将 STDERR 着色为红色
我的问题是我的表单正在提交(到节点/express api),如果我console.log req.body(@ api),结果是一个空对象。但是,如果我在客户端上 console.log ,则序列化
我对 addon-sdk 还很陌生,并且遇到了一个对我来说无法解释的问题。到目前为止,我一直在使用 jpm run 来测试一切 - 并且一切都很好。现在,我即将完成我想要完成的任务,所以我想在“普通”
我是一名优秀的程序员,十分优秀!