Создание скриншота в WebGl нужного размера

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Создание скриншота в WebGl нужного размера

Сообщение wasp 04 июл 2023, 13:06

Я делаю возможность скринить определенную область экрана в сборке WebGl. Столкнулся со следующей проблемой. Если скриню весь экран то все получается на отлично. Он сохраняется на компьютере как и должно. Но если переделываю код для скрина определенной области, то в сборке все работает, а в билде кнопка по которой открываем панель выбора папки сохранения отказывается работать. Кто знает, подскажите в чем ошибся. Вот мой код.
Синтаксис:
Используется csharp
 public Canvas canvas;
    public RectTransform cropArea;
    Texture2D croppedTexture;
    Texture2D originalTexture;

    public enum ImageFormat
    {
        jpg,
        png
    }
    private bool _isRecording = false;
    [DllImport("__Internal")]
    private static extern void DownloadFileJsLib(byte[] byteArray, int byteLength, string fileName);
   
    public void DownloadFile(byte[] bytes, string fileName, string fileExtension)
    {
        if (fileName == "") fileName = "UnnamedFile";
#if UNITY_EDITOR
        string path = UnityEditor.EditorUtility.SaveFilePanel("Save file...", "", fileName, fileExtension);
        System.IO.File.WriteAllBytes(path, bytes);
        Debug.Log("File saved: " + path);
#elif UNITY_WEBGL
        DownloadFileJsLib(bytes, bytes.Length, fileName + "." + fileExtension);
#endif
    }

    public void GetScreenshot(ImageFormat imageFormat, int screenshotUpscale, string fileName = "")
    {
        if (!_isRecording) StartCoroutine(RecordUpscaledFrame(imageFormat, screenshotUpscale, fileName));
    }

    IEnumerator RecordUpscaledFrame(ImageFormat imageFormat, int screenshotUpscale, string fileName)
    {
        _isRecording = true;
        cropArea.gameObject.SetActive(false);
        yield return new WaitForEndOfFrame();
        try
        {
            if (fileName == "")
            {
                int resWidth = Camera.main.pixelWidth * screenshotUpscale;
                int resHeight = Camera.main.pixelHeight * screenshotUpscale;
                string dateFormat = "yyyy-MM-dd-HH-mm-ss";
                fileName = resWidth.ToString() + "x" + resHeight.ToString() + "px_" + System.DateTime.Now.ToString(dateFormat);

                int width = (int)(cropArea.rect.width * canvas.scaleFactor);
                int height = (int)(cropArea.rect.height * canvas.scaleFactor);
                int x = (int)(cropArea.anchoredPosition.x * canvas.scaleFactor);
                int y = (int)(cropArea.anchoredPosition.y * canvas.scaleFactor);
                Texture2D screenShot = new Texture2D(width, height);
                Texture2D originalTexture = ScreenCapture.CaptureScreenshotAsTexture(screenshotUpscale);
                if (x + width <= originalTexture.width && y + height <= originalTexture.height)
                {
                    screenShot.SetPixels(originalTexture.GetPixels(x, y, width, height));
                    if (imageFormat == ImageFormat.jpg) DownloadFile(screenShot.EncodeToJPG(), fileName, "jpg");
                    else if (imageFormat == ImageFormat.png) DownloadFile(screenShot.EncodeToPNG(), fileName, "png");
                }
                Destroy(screenShot);
                Destroy(screenShot);
                cropArea.gameObject.SetActive(true);
            }

        }
        catch (System.Exception e)
        {
            Debug.Log("Original error: " + e.Message);
        }
        _isRecording = false;
    }
}
wasp
UNец
 
Сообщения: 9
Зарегистрирован: 16 ноя 2019, 13:25

Re: Создание скриншота в WebGl нужного размера

Сообщение Saltant 04 июл 2023, 14:49

Один из потенциальных источников проблемы - это вызов DownloadFileJsLib функции из кода C#, которая является внешней функцией. Возможно, эта функция не правильно настроена или несовместима с вашей текущей средой выполнения. Убедитесь, что данная функция корректно настроена и поддерживается для вашей сборки WebGL.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Создание скриншота в WebGl нужного размера

Сообщение DbIMok 04 июл 2023, 15:08

посмотрите в Console браузера что у вас за ошибки. код похож на обычный https://forum.unity.com/threads/user-im ... pp.474715/
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Создание скриншота в WebGl нужного размера

Сообщение wasp 04 июл 2023, 15:26

Предупреждение такое в консоле
NPOT Textures are not supported on the current graphics API. Mipmapping is disabled for 700 by 500 Texture2D.

Но если в коде убрать тот кусок который скринит определенную область ошибок нет. Все работает замечательно. Вот обычный код.

Синтаксис:
Используется csharp
 try
        {
            if (fileName == "")
            {
                int resWidth = Camera.main.pixelWidth * screenshotUpscale;
                int resHeight = Camera.main.pixelHeight * screenshotUpscale;
                string dateFormat = "yyyy-MM-dd-HH-mm-ss";
                fileName = resWidth.ToString() + "x" + resHeight.ToString() + "px_" + System.DateTime.Now.ToString(dateFormat);
            }
            Texture2D screenShot = ScreenCapture.CaptureScreenshotAsTexture(screenshotUpscale);
            if (imageFormat == ImageFormat.jpg) DownloadFile(screenShot.EncodeToJPG(), fileName, "jpg");
            else if (imageFormat == ImageFormat.png) DownloadFile(screenShot.EncodeToPNG(), fileName, "png");
            Object.Destroy(screenShot);
        }
wasp
UNец
 
Сообщения: 9
Зарегистрирован: 16 ноя 2019, 13:25


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25