如何裁剪捕获的图像? - C#

时间:2017-05-06 15:23:29

标签: c# unity3d camera unity2d

是否可以根据我想要的形状裁剪拍摄的图像?我使用原始图像+网络摄像头纹理激活相机并保存图像。我使用UI图像叠加方法作为遮罩来覆盖不需要的部分。我将在后一部分将图片附加到char模型。对不起,我是团结的新手。感谢你的帮助!

enter image description here

以下是我的代码中的内容:

:checked

}

1 个答案:

答案 0 :(得分:1)

除非我没有正确理解你的问题,否则你可以打电话给'devCam.pause!

<强> 更新

您正在寻找的内容基本上是在某些条件下将屏幕上的像素复制到单独的图像上。所以你可以使用这样的东西:https://docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html

我并不是100%确定你想要用它做什么,但是如果你想拥有一个可以用作精灵的图像,例如,你可以扫描每个像素以及像素颜色值与蓝色背景相同,将其换成100%透明像素(Alpha通道中为0)。那只会给你带黑头发和耳朵的脸。

更新2

我推荐您使用链接复制相机视图中的所有像素,因此您不必担心源图像。这是未经测试的方法,只要只有一种背景颜色就可以即插即用,否则你需要稍微修改以测试不同的颜色。

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);
}