Can I take a photo in Unity using the device's camera?

前端 未结 7 778
春和景丽
春和景丽 2020-12-06 00:18

I\'m entirely unfamiliar with Unity3D\'s more complex feature set and am curious if it has the capability to take a picture and then manipulate it. Specifically my desire is

相关标签:
7条回答
  • 2020-12-06 00:28

    Yes, this is possible. You will want to look at the WebCamTexture functionality.

    You create a WebCamTexture and call its Play() function which starts the camera. WebCamTexture, as any Texture, allows you to get the pixels via a GetPixels() call. This allows you to take a snapshot in when you like, and you can save this in a Texture2D. A call to EncodeToPNG() and subsequent write to file should get you there.

    Do note that the code below is a quick write-up based on the documentation. I have not tested it. You might have to select a correct device if there are more than one available.

    using UnityEngine;
    using System.Collections;
    using System.IO;
    
    public class WebCamPhotoCamera : MonoBehaviour 
    {
        WebCamTexture webCamTexture;
    
        void Start() 
        {
            webCamTexture = new WebCamTexture();
            GetComponent<Renderer>().material.mainTexture = webCamTexture; //Add Mesh Renderer to the GameObject to which this script is attached to
            webCamTexture.Play();
        }
    
        IEnumerator TakePhoto()  // Start this Coroutine on some button click
        {
    
        // NOTE - you almost certainly have to do this here:
    
         yield return new WaitForEndOfFrame(); 
    
        // it's a rare case where the Unity doco is pretty clear,
        // http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html
        // be sure to scroll down to the SECOND long example on that doco page 
    
            Texture2D photo = new Texture2D(webCamTexture.width, webCamTexture.height);
            photo.SetPixels(webCamTexture.GetPixels());
            photo.Apply();
    
            //Encode to a PNG
            byte[] bytes = photo.EncodeToPNG();
            //Write out the PNG. Of course you have to substitute your_path for something sensible
            File.WriteAllBytes(your_path + "photo.png", bytes);
        }
    }
    
    0 讨论(0)
  • 2020-12-06 00:33

    If you want to do that without using a third party plugin then @FuntionR solution will help you. But, if you want to save the captured photo to the gallery (Android & iOS)then it's not possible within unity, you have to write native code to transfer photo to gallery and then call it from unity.

    Here is a summarise blog which will guide you to achieve your goal. http://unitydevelopers.blogspot.com/2018/07/pick-image-from-gallery-in-unity3d.html

    Edit: Note that, the above thread describes image picking from the gallery, but the same process will be for saving the image to the gallery.

    0 讨论(0)
  • 2020-12-06 00:35

    There is a plugin available for this type of functionality called Camera Capture Kit - https://www.assetstore.unity3d.com/en/#!/content/56673 and while the functionality provided is geared towards mobile it contains a demo of how you can use the WebCamTexture to take a still image.

    0 讨论(0)
  • 2020-12-06 00:37

    Bart's answer has a required modification. I used his code and the pic I was getting was black. Required modification is that we have to convert TakePhoto to a coroutine and add

    yield return new WaitForEndOfFrame(); 
    

    at the start of Coroutine. (Courtsey @fafase) For more details see http://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html

    You can also refer to

    Take photo using webcam is giving black output[Unity3D]

    0 讨论(0)
  • 2020-12-06 00:49

    Yes, You can. I created Android Native camera plugin that can open your Android device camera, capture image, record video and save that in the desired location of your device with just a few lines of code.

    0 讨论(0)
  • 2020-12-06 00:52

    For those trying to get the camera to render live feed, here's how I managed to pull it off. First, I edited Bart's answer so the texture would be assigned on Update rather than just on Start:

    void Start()
    {
        webCamTexture = new WebCamTexture();
        webCamTexture.Play();
    }
    
    void Update()
    {
        GetComponent<RawImage>().texture = webCamTexture;
    }
    

    Then I attached the script to a GameObject with a RawImage component. You can easily create one by Right Click -> UI -> RawImage in the Hierarchy in the Unity Editor (this requires Unity 4.6 and above). Running it should show a live feed of the camera in your view. As of this writing, Unity 5 supports the use of webcams in the free personal edition of Unity 5.

    I hope this helps anyone looking for a good way to capture live camera feed in Unity.

    0 讨论(0)
提交回复
热议问题