Viv*_*hra 7 android resolution image android-camera
我正在尝试计算可以使用我的自定义相机拍摄的剩余照片数量,并向用户显示该数量.我尝试使用以下代码:
private void numberOfPhotosAvailable() {
long photosAvailable = 0;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
resolution=getResolution();
long bytesPerPhoto=resolution/1048576;
long bytesAvailable = (long) stat.getAvailableBlocksLong() * (long) stat.getBlockSizeLong();
long megAvailable = bytesAvailable / 1048576;
System.out.println("Megs :" + megAvailable);
photosAvailable = megAvailable / bytesPerPhoto;
tvAvailablePhotos.setText("" + photosAvailable);
}
Run Code Online (Sandbox Code Playgroud)
获得解决方法.
public long getResolution(){
long resolution=0;
Camera.Parameters params=mCamera.getParameters();
List<Camera.Size> sizes = params.getSupportedPictureSizes();
Camera.Size size = sizes.get(0);
int width=size.width;
int height=size.height;
resolution=width*height;
return resolution;
}
Run Code Online (Sandbox Code Playgroud)
问题: 手机摄像头显示的计数与我的应用程序中显示的计数有很大差异.
那么这样做的正确方法是什么?
注意:我只会以最高质量拍摄图像.因此我只根据一个分辨率计算计数.
经过大量研究和谷歌搜索后,我来到了这个网站。
根据该网站,以下是获取文件大小的步骤。
因此,当我按照上述步骤操作时,即我的探测器分辨率为5376X3024。继续执行上述步骤,我最终得到了 39 MB 作为图像大小的答案。
但相机拍摄的图像大小约为 8-10 MB,仍然与我在上面得到的结果相距甚远。
我的手机(HTC Desire 10 pro)有可用的专业模式设置。在此模式下,照片将被捕获为原始图像。因此,当我检查捕获的原始图像的大小时,我很有趣,因为原始文件的大小确实约为 39 MB,这表明上述步骤对于计算图像的原始大小是正确的。
结论
通过上述步骤我得出的结论是,手机的软件确实使用了一些压缩算法来缩小图像尺寸。所以我所比较的实际上是压缩的图像,因此图像的数量是不同的。
可能的解决方案
我现在的目标是从相机中获取最后单击的图像,获取其文件大小并根据该文件大小显示计数。这也将是一个近似结果,但我认为没有任何解决方案可以获得准确的计数。
这是我用来实现上述解决方案的代码
private void numberOfPhotosAvailable() {
long photosAvailable = 0;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
File lastFile=null;
lastFile=utils.getLatestFilefromDir(prefManager.getString(PrefrenceConstants.STORAGE_PATH));
if (lastFile!=null){
double fileSize=(lastFile.length())/(1024*1024);
long bytesAvailable = (long) stat.getAvailableBlocksLong() * (long) stat.getBlockSizeLong();
long megAvailable = bytesAvailable / 1048576;
System.out.println("Megs :" + megAvailable);
photosAvailable = (long) (megAvailable / fileSize);
tvAvailablePhotos.setText("" + photosAvailable);
}else{
tvAvailablePhotos.setVisibility(View.INVISIBLE);
}
}
Run Code Online (Sandbox Code Playgroud)