2016-03-01 10 views
8

Sorprendentemente in Unity, per anni l'unico modo semplicemente scala un vero e PNG è quello di utilizzare la libreria molto impressionante http://wiki.unity3d.com/index.php/TextureScaleScala un PNG in Unity5? - Bountie

Esempio seguito

Come si fa a scalare un PNG usando le funzioni Unity5 ? Ci deve essere un modo ora con una nuova interfaccia utente e così via.

Quindi, ridimensionamento dei pixel effettivi (ad esempio in Color[]) o letteralmente un file PNG, forse scaricato dalla rete.

(A proposito, se siete nuovi a l'Unità, la chiamata Resize non ha alcuna relazione. E 'semplicemente cambia la dimensione di un array.)

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 
    } 

Basta BTW mi viene in mente, molto probabilmente sto solo parlando di ridimensionamento qui (come spesso devi fare per pubblicare un'immagine, creare qualcosa al volo o altro.) Immagino che non ci sarebbe spesso bisogno di ingrandire le dimensioni di un'immagine; è inutile in termini di qualità.

Bounty in arrivo!

+2

Non c'è ancora costruito in modo di scalare un png utilizzando le funzioni di Unity, il codice sul Wiki modo migliore, ma potrebbe essere possibile integrare diavolo o FreeImage a fare il ridimensionamento o la manipolazione, se sono necessarie cose più avanzate – Chris

risposta

4

Se stai bene con il ridimensionamento, in realtà c'è un modo più semplice utilizzando un RenderTexture temporaneo e Graphics.Blit. Se hai bisogno che sia Texture2D, scambia RenderTexture.active temporaneamente e leggi i suoi pixel su Texture2D dovrebbe fare il trucco. Per esempio:

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

vecchia domanda ri-sveglia eh! affascinante non ci ho mai pensato. Mi chiedo come sia la qualità? Ci provo. – Fattie

+0

oh non ho visto la data: p – dkrprasetya

+0

nessun problema! In realtà ho aggiunto una taglia - forse la vincerai di default :) – Fattie