如何计算Android中自定义相机的剩余照片数量

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)

问题: 手机摄像头显示的计数与我的应用程序中显示的计数有很大差异.

那么这样做的正确方法是什么?

注意:我只会以最高质量拍摄图像.因此我只根据一个分辨率计算计数.

Viv*_*hra 2

经过大量研究和谷歌搜索后,我来到了这个网站。

根据该网站,以下是获取文件大小的步骤。

  1. 将探测器的水平像素数乘以垂直像素数即可得到探测器的总像素数。
  2. 将像素总数乘以检测器的位深度(16 位、14 位等)即可得到数据的总位数。
  3. 将总位数除以 8 等于文件大小(以字节为单位)。
  4. 将字节数除以 1024 即可得到文件大小(以千字节为单位)。再次除以 1024,得到文件大小(以兆字节为单位)。

因此,当我按照上述步骤操作时,即我的探测器分辨率为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)