5
respostas

Tirar uma foto

Estou querendo fazer um jogo que tira foto da pessoa e salva a foto no dispositivo ou pc. Teria alguma forma de fazer isso na unity? algum código? Estou pesquisando a dois dias já, mas não encontro nada especifico. Os videos que encontrei só fazem o acionamento da câmera e não a captura da imagem.

5 respostas

Existe sim. É um processo razoavelmente complicado as é possível.

Para acessar a câmera do aparelho vc vai precisar usar a classe WebCamTexture -> https://docs.unity3d.com/ScriptReference/WebCamTexture.html

Essa classe é responsável por acessa a câmera e iniciar a "gravação".

Uma vez que vc tem acesso à camera vc vai precisar de uma instancia de um Texture2D ->https://docs.unity3d.com/ScriptReference/Texture2D.html para salvar os pixels da câmera dentro dessa textura.

Com os pixels salvos nesse objeto, vc pode chamar o método EncodeToPNG para criar uma sequência de bytes que o PC entenda como um PNG e por fim vai ter que salvar esses Bytes em um arquivo usando a lib de I/O do C#.

Espero ter ajudado

Opa Ricardo beleza?

Entao, eu fiz parecido com esta forma ai. Mas ele só salva a foto na pasta de destino se eu ja tiver dentro da pasta um arquivo .PNG caso contrario ele nao salva e fala que nao encontra o destino. E tambem só salva uma foto. Vou mandar meu código para vc dar uma olhada.

using UnityEngine; using UnityEngine.UI;

public class Photographer : MonoBehaviour { public Texture2D photoTexture2d; public RawImage rawimage; public WebCamTexture webcamTexture; public Button btnOverride; public Button btnCapture;

void Start()
{
    this.btnCapture.onClick.AddListener(() => TakePhoto());
    this.btnOverride.onClick.AddListener(() => OverrideImage());

    this.webcamTexture = new WebCamTexture();

    var filename = Application.persistentDataPath + "/my_photo/pictures.png";
    var bytes = System.IO.File.ReadAllBytes(filename);
    if (bytes != null)
    {
        var texture = new Texture2D(800, 800);
        texture.LoadImage(bytes);
        this.rawimage.material.mainTexture = texture;

        this.btnOverride.interactable = true;
        this.btnCapture.interactable = false;
    }
}

public void OverrideImage()
{
    this.btnOverride.interactable = false;
    this.btnCapture.interactable = true;

    this.rawimage.texture = this.webcamTexture;
    this.rawimage.material.mainTexture = this.webcamTexture;
    this.webcamTexture.Play();
}

public void TakePhoto()
{
    this.btnOverride.interactable = true;
    this.btnCapture.interactable = false;

    this.photoTexture2d = new Texture2D(rawimage.texture.width, rawimage.texture.height);
    this.photoTexture2d.SetPixels(this.webcamTexture.GetPixels());
    this.photoTexture2d.Apply();

    this.webcamTexture.Pause();

    this.rawimage.texture = this.photoTexture2d;

    System.IO.File.WriteAllBytes(Application.persistentDataPath + "/my_photo/pictures.png", this.photoTexture2d.EncodeToPNG());
}

}

Oi Felipe,

Quanto ao erro dele não salvar caso já tenha um PNG na pasta, eu acho bem estranho, pq na documentação desse método ele fala que cria o arquivo caso ele não existir. Vc tem certeza que o erro não é porque ele não encontrou a pasta "my_photo"?

https://docs.microsoft.com/pt-br/dotnet/api/system.io.file.writeallbytes?view=netframework-4.7.2

Outra coisa que ele fala na documentação é que se o arquivo já existe ele vai sim ser sobrescrito. O que vc pode fazer é verificar se já existe o arquivo "pictures.png" na pasta e adicionar um index nele, de acordo com a quantidade de arquivos nessa pasta.

Vc pode assistir o curso de I/O em C# aqui da alura para entender um pouco melhor como funciona essa parte de gravação. https://cursos.alura.com.br/course/csharp-io

É pode ser que ele nao encontrou a pasta, pois ele precisar de um arquivo .png vazio pra receber a imagem a imagem tirada nao ta certo. Ele teria que criar esse .png na pasta ao tirar a foto. Mas tranquilo, eu vou dar uma olhada no curso para entender mais sobre isso. Obrigado por enquanto.