Jump to content
Unity Insider Forum
Sign in to follow this  
Kojote

Screenshot + Größe

Recommended Posts

Grüße!

Mal ne Frage, ich habe mir für mein Speicher und Lademenü überlegt, dass ich eine Grafikanzeige einbaue, an dem Punkt wo gespeichert wird (weißer Leerraum). Dazu wird ein Screenshot von der aktuellen Kameraansicht gemacht, dafür habe ich schon ein Script. Nun brauche ich aber nur ein kleines Bild und nicht die volle Monitorauflösung, zumal PNG ja in solchen größen eh eine zu große Dateigröße hat. Kann man beim Speichern, die Größe des Bildes beeinflussen?

HU5tYUXy.jpg

Grüße Kojote

Share this post


Link to post
Share on other sites

Ach sorry, ich erstelle ein Bild mit:

 

ScreenCapture.CaptureScreenshot(path + "/Screenshot_" + time + ".png", 0);

 

Share this post


Link to post
Share on other sites

Jau, dann nimm mal die "ToTexture"-Version, damit du die Textur runterskalieren kannst (siehe Link von @Mr 3d), und dann kannst du sie selber in eine Datei speichern. Dabei hilft die Klasse ImageConversion. Die spuckt dir bytes aus, die du dann wiederum mit einem FileStream in eine Datei schreiben kannst.

Share this post


Link to post
Share on other sites

OK, also ich bin eine ganze Ecke weiter gekommen, speichern funktioniert soweit:

       IEnumerator RecordSavegamePicture() {
            yield return new WaitForEndOfFrame();

            texture2D = ScreenCapture.CaptureScreenshotAsTexture();

            yield return new WaitForEndOfFrame();

            EditPicture();
        }

        private void EditPicture() {
            texture2D = ScalePictureTexture(texture2D, savegamePictureTargetWidth, savegamePictureTargetHight);
            SavePicture();
        }

        private Texture2D ScalePictureTexture(Texture2D source, int targetWidth, int targetHight) {
            Texture2D result = new Texture2D(targetWidth, targetHight, source.format, false);
            Color[] rpixels = result.GetPixels(0);
            float incX = (1.0f / (float)targetWidth);
            float incY = (1.0f / (float)targetHight);
            for (int px = 0; px < rpixels.Length; px++) {
                rpixels[px] = source.GetPixelBilinear(incX * ((float)px % targetWidth), incY * ((float)Mathf.Floor(px / targetHight)));
            }
            result.SetPixels(rpixels, 0);
            result.Apply();
            return result;
        }

        private void SavePicture() {
            // Textur in JPG und schreibbares Byte-Array Umwandeln
            byte[] byteTextureArray = texture2D.EncodeToJPG(85);

            // Dateinamen festlegen
            file = path + "/SavePicture_" + selectedSavegame + ".jpg";

            // Speichern
            FileStream fileStream = File.Open(file, FileMode.OpenOrCreate);
            fileStream.Write(byteTextureArray, 0, byteTextureArray.Length);
            fileStream.Close();
        }

Nur beim Laden harkts noch, ich kann zwar den Bytestream wieder lesen und in ein Image bringen und dann als Sprite zuweisen, aber dann ... Bekomme nur ein schwarzes Bild.

private void LoadPicturesTest() {
            for (int i = 0; i < savegamePictureSpriteArray.Length; i++) {
                file = path + "/SavePicture_1.jpg";
                if (File.Exists(file)) {
                    // Filestream öffnen und Daten in Byte-Array schreiben
                    FileStream fileStream = File.Open(file, FileMode.Open);
                    byte[] byteTextureArray = new byte[fileStream.Length];
                    fileStream.Read(byteTextureArray, 0, (int)fileStream.Length);
                    fileStream.Close();

                    // Textur aus dem Byte-Array erzeugen
                    Texture2D texture2D = new Texture2D(savegamePictureTargetWidth, savegamePictureTargetHight);
                    texture2D.LoadImage(byteTextureArray);
                    texture2D.Apply();

                    // Aus der Textur das Sprite erzeugen
                    savegamePictureSpriteArray[0] = Sprite.Create(texture2D, new Rect(0, 0, savegamePictureTargetWidth, savegamePictureTargetHight), Vector2.zero);

                    savegamePictureImage.sprite = savegamePictureSpriteArray[0];
                    Debug.Log("Erledigt!");
                }
            }
        }

EDIT:
Sehe gerade, nen Bug meldet er auch:

Assertion failed: Invalid AABB inAABB
UnityEngine.Canvas:SendWillRenderCanvases()

EDIT 2:

Super Fehler! Beim testen vergessen Länge und Breite des Bildes anzugeben, Code funktioniert wunderbar:

ut992P97.jpg

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

×
×
  • Create New...