Mobile 如何在Android和iPhone上拍摄占据整个屏幕的图像?

Mobile 如何在Android和iPhone上拍摄占据整个屏幕的图像?,mobile,camera,image-size,gluon,snapchat,Mobile,Camera,Image Size,Gluon,Snapchat,我希望在手机上拍摄可以覆盖整个屏幕的照片,这是在Snapchat应用程序中完成的。Android和iPhone拍摄的图像仅覆盖屏幕中央的一部分,可能是为了让菜单栏覆盖其余部分 如果您在snapchat中拍摄图像-并将其导出到您的相机卷,您将看到图像仍然放大-覆盖整个屏幕。这就是我希望我的照片被拍摄的方式。现在,由于图像太小,它们会变形——因为我试图用整个屏幕显示它们 我正在使用Gluon和PictureService: 然而,我认为你需要调整更深层次的东西来实现这一点。有人能给我指出正确的方向吗

我希望在手机上拍摄可以覆盖整个屏幕的照片,这是在Snapchat应用程序中完成的。Android和iPhone拍摄的图像仅覆盖屏幕中央的一部分,可能是为了让菜单栏覆盖其余部分

如果您在snapchat中拍摄图像-并将其导出到您的相机卷,您将看到图像仍然放大-覆盖整个屏幕。这就是我希望我的照片被拍摄的方式。现在,由于图像太小,它们会变形——因为我试图用整个屏幕显示它们

我正在使用Gluon和PictureService:


然而,我认为你需要调整更深层次的东西来实现这一点。有人能给我指出正确的方向吗?

iOS上的摄像头纵横比和屏幕纵横比不同。这就是为什么不能在完全显示图像的同时避免变形。但在视频中,它与屏幕纵横比相匹配。所以我认为Snapchat以某种方式拍摄了屏幕截图,或者在视频模式下拍摄了一帧

然而,看看我的Android手机,摄像头在视频模式下没有显示在整个屏幕上,没有匹配的纵横比。我大吃一惊。我在上面下载了snapchat,发现快照仍然覆盖了整个屏幕——我甚至更加惊讶

然后我开始意识到,这一扣在两侧被剪掉了。因此,他们所做的只是简单地剪切原始图像,直到它与显示器的纵横比匹配

以下是我用来剪切Android图像的方法:

public Image cutImageFit(Scene scene, Image image){
    PixelReader pixelReader = image.getPixelReader();
    double sceneRatio = scene.getWidth() / scene.getHeight();

    double width = image.getWidth();
    double height = image.getHeight();
    double ratio = width / height;

    // System.out.println("Scene is " + scene.getWidth() + " and " + scene.getHeight());
    // System.out.println("sceneRatio " + sceneRatio);
    // System.out.println("ratio is " + ratio);

    if(sceneRatio > 1){
        double cutTo = width / sceneRatio;
        height = cutTo;
    }
    else if(sceneRatio < 1){
        double cutTo = height * sceneRatio;
        width = cutTo;
    }
    else{
        // Square scene...
    }

    Double d = width;
    int w = d.intValue();
    d = height;
    int h = d.intValue();
    System.out.println("new width " + w + " and height " + h + " for the image");
    WritableImage writableImage = new WritableImage(pixelReader, 0, 0, w, h);
    return writableImage;
}
。。。您还可以编辑该方法,使其剪切两侧,而不是仅剪切一侧。这很有帮助:

然而,当谈到iOS图像时,我遇到了一些问题。图像必须旋转。如果它是与iphone垂直拍摄的,也就是说。如果有人能帮上忙,我会很高兴的

我可以通过使用imageView旋转图像,然后拍摄javafx快照来解决后一个问题,使用该方法将pas作为图像参数,而不是iOS原始图像。这样,本地cordinate系统在旋转后也与ate系统中的其他GUI Cordinal保持同步。因此,实际上,x轴和y轴的重新标记已经完成

编辑:android defualt摄像头实际上包含了一个我不知道的全屏设置。因此,只需选择该设置即可。它会产生一个白色区域,但我认为这是因为该应用程序无法显示在状态栏区域。在其他默认的照片查看器应用程序中,一切看起来都很好,它们可以在状态栏下显示图像。因此,可以使用上述方法裁剪图像,也可以使用José在对问题的评论中建议的独立Android层创建一个全屏服务来显示拍摄的图像


说到iOS,可以使用摄像头第三方应用程序,也可以编辑iOSPictureService,该服务连接了本机ObjectiveC代码。

JavaFX ImageView以全屏模式显示照片对您有用吗?我不知道,但我很乐意尝试一下OK,那么你的意思是说摄像机首先应该处于全屏模式?关于CameraAPI,请参见答案。基本上,它的功能非常类似:它创建一个本机层以全屏呈现媒体文件。您需要将媒体播放器更换为摄像头。您始终可以克隆Charm Down存储库,修改项目,构建并在本地安装。/gradlew clean build install。然后在项目中使用它:将mavenLocal添加到build.gradle中的存储库列表中,并将快照添加到downConfig,即版本:“3.7.0-snapshot”。如果要使用屏幕上显示的裁剪图像,需要将相同的裁剪矩形应用到从摄影机回调接收的缓冲区中。如果您想基于“snapchat样式”全屏预览拍摄hi-rez静态照片,请确保设置相机,使静态捕捉大小与您使用的预览具有相同的纵横比(我是指应用裁剪前的纵横比)。原因是,当摄影机纵横比改变时,某些摄影机具有非常不同的视野。