2016-03-01 6 views
8

Überraschenderweise in Unity, seit Jahren die einzigen Weg einfach Skala eine tatsächliche PNG die sehr geile Bibliothek http://wiki.unity3d.com/index.php/TextureScaleSkalieren Sie ein PNG in Unity5? - Bountie

Beispiel unter

verwenden Wie skalieren Sie ein PNG mit Unity5 Funktionen ? Es muss jetzt einen Weg geben mit neuer UI und so weiter.

Also Skalierung der tatsächlichen Pixel (wie in Color[]) oder buchstäblich eine PNG-Datei, vielleicht aus dem Netz heruntergeladen.

(BTW, wenn Sie neu in der Einheit, die Resize Anruf nicht verwandt ist. Er hat lediglich die Größe eines Arrays ändert.)

public WebCamTexture wct; 

public void UseFamousLibraryToScale() 
    { 
    // take the photo. scale down to 256 
    // also crop to a central-square 

    WebCamTexture wct; 
    int oldW = wct.width; // NOTE example code assumes wider than high 
    int oldH = wct.height; 

    Texture2D photo = new Texture2D(oldW, oldH, 
      TextureFormat.ARGB32, false); 
    //consider WaitForEndOfFrame() before GetPixels 
    photo.SetPixels(0,0,oldW,oldH, wct.GetPixels()); 
    photo.Apply(); 

    int newH = 256; 
    int newW = Mathf.FloorToInt(
      ((float)newH/(float)oldH) * oldW); 

    // use a famous Unity library to scale 
    TextureScale.Bilinear(photo, newW,newH); 

    // crop to central square 256.256 
    int startAcross = (newW - 256)/2; 
    Color[] pix = photo.GetPixels(startAcross,0, 256,256); 
    photo = new Texture2D(256,256, TextureFormat.ARGB32, false); 
    photo.SetPixels(pix); 
    photo.Apply(); 
    demoImage.texture = photo; 

    // consider WriteAllBytes(
    // Application.persistentDataPath+"p.png", 
    // photo.EncodeToPNG()); etc 
    } 

Gerade BTW fällt mir bin ich wahrscheinlich nur reden Scale down hier (wie du oft tun musst, um ein Bild zu posten, etwas on-the-fly zu erstellen oder was auch immer). Ich denke, es würde nicht oft nötig sein, ein Bild in der Größe zu vergrößern; es ist sinnlos in Bezug auf die Qualität.

Bounty kommt auf!

+2

Es gibt noch gebaut kein in Art und Weise ein png mit Unity-Funktionen der Skalierung, der Code auf dem Wiki der beste Weg, aber es könnte möglich sein, DEVIL oder Freeimage zu integrieren, um die Skalierung oder Manipulation zu tun, wenn fortgeschrittenere Sachen werden benötigt. – Chris

Antwort

4

Wenn Sie mit Stretch-Skalierung einverstanden sind, gibt es einen einfacheren Weg, indem Sie eine temporäre RenderTexture und Graphics.Blit verwenden. Wenn Sie Texture2D benötigen, können Sie RenderTexture.active vorübergehend austauschen und die Pixel zu Texture2D lesen. Zum Beispiel:

public Texture2D ScaleTexture(Texture src, int width, int height){ 
    RenderTexture rt = RenderTexture.GetTemporary(width, height); 
    Graphics.Blit(src, rt); 

    RenderTexture currentActiveRT = RenderTexture.active; 
    RenderTexture.active = rt; 
    Texture2D tex = new Texture2D(rt.width,rt.height); 

    tex.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0); 
    tex.Apply(); 

    RenderTexture.ReleaseTemporary(rt); 
    RenderTexture.active = currentActiveRT; 

    return tex; 
} 
+0

alte Frage re-weckt eh! faszinierend, ich habe nie darüber nachgedacht. Ich frage mich, wie die Qualität ist? Ich werde es versuchen. – Fattie

+0

oh habe das Datum nicht gesehen: p – dkrprasetya

+0

keine Sorgen! Ich habe tatsächlich ein Kopfgeld hinzugefügt - vielleicht gewinnst du es als Standard :) – Fattie

Verwandte Themen