How To Crop Captured Image? --C#

Deadly 提交于 2019-12-24 07:09:08

问题


Is it possible to crop the captured image based on the shape that I want? I'm using raw image + web cam texture to activate the camera and save the image. And I'm using UI Image overlay method as a mask to cover the unwanted parts. I will be attaching the picture to the char model in the latter part. Sorry, I am new to unity. Grateful for your help!

Below is what I have in my code:

// start cam
 void Start () {
     devices = WebCamTexture.devices;
     background = GetComponent<RawImage> ();
     devCam = new WebCamTexture ();
     background.texture = devCam;
     devCam.deviceName = devices [0].name;
     devCam.Play ();
 }

 void OnGUI()
 {
     GUI.skin = skin;   
        //swap front and back camera
     if (GUI.Button (new Rect ((Screen.width / 2) - 1200, Screen.height - 650, 250, 250),"", GUI.skin.GetStyle("btn1"))) {
         devCam.Stop();
         devCam.deviceName = (devCam.deviceName == devices[0].name) ? devices[1].name : devices[0].name;
         devCam.Play();
     }
         //snap picture
     if (GUI.Button (new Rect ((Screen.width / 2) - 1200, Screen.height - 350, 250, 250), "", GUI.skin.GetStyle ("btn2"))) {
         OnSelectCapture ();
                //freeze cam here?
     }
 }


 public void OnSelectCapture()
 {
     imgID++;
     string fileName = imgID.ToString () + ".png";
     Texture2D snap = new Texture2D (devCam.width, devCam.height); 
     Color[] c;                                                         
     c = devCam.GetPixels ();                             
     snap.SetPixels (c);                                                 
     snap.Apply ();                                                    

     // Save created Texture2D (snap) into disk as .png
     System.IO.File.WriteAllBytes (Application.persistentDataPath +"/"+ fileName, snap.EncodeToPNG ());
 }

}


回答1:


Unless I am not understanding your question correctly, you can just call `devCam.pause!

Update

What you're looking for is basically to copy the pixels from the screen onto a separate image under some condition. So you could use something like this: https://docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html

I'm not 100% sure what you want to do with it exactly but if you want to have an image that you can use as a sprite, for instance, you can scan each pixel and if the pixel colour value is the same as the blue background, swap it for a 100% transparent pixel (0 in the alpha channel). That will give you just the face with the black hair and the ears.

Update 2

The link that I referred you to copies all pixels from the camera view so you don't have to worry about your source image. Here is the untested method, it should work plug and play so long as there is only one background colour else you will need to modify slightly to test for different colours.

IEnumerator GetPNG()
{
    // Create a texture the size of the screen, RGB24 format
    yield return new WaitForEndOfFrame();
    int width = Screen.width;
    int height = Screen.height;
    Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);

    // Read screen contents into the texture
    tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
    tex.Apply();

    //Create second texture to copy the first texture into minus the background colour. RGBA32 needed for Alpha channel
    Texture2D CroppedTexture = new Texture2D(tex.width, tex.height, TextureFormat.RGBA32, false);
    Color BackGroundCol = Color.white;//This is your background colour/s

    //Height of image in pixels
    for(int y=0; y<tex.height; y++){
        //Width of image in pixels
        for(int x=0; x<tex.width; x++){
            Color cPixelColour = tex.GetPixel(x,y);
            if(cPixelColour != BackGroundCol){
                CroppedTexture.SetPixel(x,y, cPixelColour); 
            }else{
                CroppedTexture.SetPixel(x,y, Color.clear);
            }
        }
    }

    // Encode your cropped texture into PNG
    byte[] bytes = CroppedTexture.EncodeToPNG();
    Object.Destroy(CroppedTexture);
    Object.Destroy(tex);

    // For testing purposes, also write to a file in the project folder
    File.WriteAllBytes(Application.dataPath + "/../CroppedImage.png", bytes);
}


来源:https://stackoverflow.com/questions/43822132/how-to-crop-captured-image-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!