2016-03-01 13 views
8

驚くべきことに、実際のP​​NGがUnity5でPNGを拡大しますか? - ユニティでBountie

どのようにUnity5機能を使用してPNGをスケーリングん以下の非常に素晴らしいライブラリhttp://wiki.unity3d.com/index.php/TextureScale

例を使用することです単にスケールに年間の唯一の方法 ?新しいUIなどの方法が必要です。

したがって、実際のピクセル(たとえば、Color[]など)をスケーリングするか、文字通りネットからダウンロードするPNGファイル。

(あなたがUnityへの新しいしているところで場合、Resize呼び出しは無関係である。それは単に配列のサイズを変更します。)

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 
    } 

ちょうどところで、それは私がおそらく唯一話している私に起こりますここでは縮小しています(イメージを投稿するために頻繁に行う必要があるように、その場で何かを作成してください)。私は、イメージのサイズを拡大する必要はしばしばありません。それは無意味な品質です。

バウンティが登場!

+2

はユニティ機能を使用してPNGをスケーリングする方法で構築なし、Wikiにコードの最良の方法は、しかし、あればスケーリングや操作を行うには悪魔やfreeimageを統合することも可能かもしれないまだありませんより高度なものが必要です。 – Chris

答えて

4

ストレッチスケーリングに問題がなければ、実際には一時的なRenderTextureとGraphics.Blitを使用すると簡単な方法があります。 Texture2Dにする必要がある場合は、RenderTexture.activeを一時的に交換し、そのピクセルをTexture2Dに読み込むと、そのトリックが実行されます。たとえば:

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

古い質問が再び覚めています!魅力的な私はそれについて考えたことはありません。私は品質がどのようなのだろうか?私はそれを行ってあげるよ。 – Fattie

+0

ああ、日付を見ていない:p – dkrprasetya

+0

心配なし!私は実際に賞金を追加 - 多分あなたはそれをデフォルトで勝つ:) – Fattie

関連する問題