Как обрезать захваченное изображение? --С #

Можно ли обрезать захваченное изображение по желаемой форме? Я использую необработанное изображение + текстуру веб-камеры, чтобы активировать камеру и сохранить изображение. И я использую метод наложения изображений пользовательского интерфейса в качестве маски, чтобы скрыть ненужные части. В последней части я прикреплю картинку к модели персонажа. Извините, я новичок в единстве. Благодарен за помощь!

введите здесь описание изображения

Вот что у меня в коде:

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

}


person Annie Tan    schedule 06.05.2017    source источник


Ответы (1)


Если я не правильно понял ваш вопрос, вы можете просто вызвать `devCam.pause!

Обновить

То, что вы ищете, - это в основном скопировать пиксели с экрана на отдельное изображение при определенных условиях. Итак, вы можете использовать что-то вроде этого: https://docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html

Я не уверен на 100%, что именно вы хотите с ним делать, но если вы хотите иметь изображение, которое можно использовать, например, в качестве спрайта, вы можете сканировать каждый пиксель, и если значение цвета пикселя совпадает с синий фон замените его на 100% прозрачный пиксель (0 в альфа-канале). Это даст вам только лицо с черными волосами и ушами.

Обновление 2

Ссылка, по которой я вас рекомендовал, копирует все пиксели из обзора камеры, поэтому вам не нужно беспокоиться об исходном изображении. Вот непроверенный метод, он должен работать по принципу Plug and Play, пока есть только один цвет фона, иначе вам нужно будет немного изменить, чтобы проверить разные цвета.

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);
}
person Nahele Allan-Moon    schedule 06.05.2017
comment
я такой глупый! извините, я обновил вопросы по теме. - person Annie Tan; 10.05.2017
comment
Я обновил свой ответ, указав, как действовать дальше. Вы должны быть в состоянии найти существующие примеры того, как сделать детали с помощью некоторого поиска в Google, но если вы застрянете, я посмотрю, смогу ли я кодировать вас в качестве отправной точки. - person Nahele Allan-Moon; 11.05.2017
comment
но то, что у меня есть в памяти устройства, - это полный четырехугольник, сделанный с помощью веб-камеры без синего фона, так как же мне сравнить значение цвета пикселя? - person Annie Tan; 11.05.2017
comment
comment
Спасибо за код. Это работает, но проблема в том, что цвет, который я изначально установил, не мог быть найден при выполнении на устройстве, вероятно, из-за разрешения устройства, поэтому цвет не совпадал и был заменен. Кроме того, на моем фоне много цветов (включая градиент), как мне учесть этот аспект? - person Annie Tan; 12.05.2017
comment
Вероятно, самый простой способ, который я могу придумать, - отобразить спрайт под вырезом лица для одного кадра и отсканировать изображение, чтобы получить координаты x и y всех пикселей, которые соответствуют цвету спрайта, а затем сохранить их в Массив Vector2 или что-то в этом роде. Затем вы можете просто удалить спрайт, отсканировать только эти пиксельные координаты и скопировать их в новую текстуру. - person Nahele Allan-Moon; 12.05.2017
comment
Ну, я пробовал использовать замену спрайтов, но не сработало, из-за чего я не совсем понимаю, как работает захват изображения. Я подумал о том, чтобы заменить фоновый спрайт на сплошной белый фон перед вызовом функции для захвата изображения, это поможет, но это не сработало. - person Annie Tan; 13.05.2017
comment
Примечание. Если я использую статические цвета (Color.cyan) вместо определения собственного цвета, изображение будет успешно обрезано. Но не наоборот. И проблема в том, что мой проект требует, чтобы я использовал пастельный цвет, поэтому я не мог использовать этот статический цвет в качестве фона. - person Annie Tan; 13.05.2017