Skip to content

Instantly share code, notes, and snippets.

@Thaina
Forked from gszauer/TextureScale.cs
Last active January 6, 2022 14:43

Revisions

  1. Thaina revised this gist Feb 22, 2021. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion TextureScale.cs
    Original file line number Diff line number Diff line change
    @@ -22,7 +22,7 @@ public static Texture2D Scale(Texture2D tex, int newWidth, int newHeight) {

    BilinearScale(0, newHeight);

    Texture2D resTexture = new Texture2D((int)W, (int)H);
    Texture2D resTexture = new Texture2D(newWidth,newHeight);
    resTexture.SetPixels(newColors);
    resTexture.Apply();
    return resTexture;
  2. Thaina revised this gist Feb 22, 2021. 1 changed file with 5 additions and 4 deletions.
    9 changes: 5 additions & 4 deletions TextureScale.cs
    Original file line number Diff line number Diff line change
    @@ -12,7 +12,7 @@ public class TextureScale {
    private static float ratioY;
    private static int w2;

    public static void Scale(Texture2D tex, int newWidth, int newHeight) {
    public static Texture2D Scale(Texture2D tex, int newWidth, int newHeight) {
    texColors = tex.GetPixels();
    newColors = new Color[newWidth * newHeight];
    ratioX = 1.0f / ((float)newWidth / (tex.width-1));
    @@ -22,9 +22,10 @@ public static void Scale(Texture2D tex, int newWidth, int newHeight) {

    BilinearScale(0, newHeight);

    tex.Resize(newWidth, newHeight);
    tex.SetPixels(newColors);
    tex.Apply();
    Texture2D resTexture = new Texture2D((int)W, (int)H);
    resTexture.SetPixels(newColors);
    resTexture.Apply();
    return resTexture;
    }

    private static void BilinearScale(int start, int end) {
  3. @johnwolve johnwolve created this gist Dec 5, 2013.
    53 changes: 53 additions & 0 deletions TextureScale.cs
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    // Modified from: http://wiki.unity3d.com/index.php/TextureScale#TextureScale.cs
    // Only works on ARGB32, RGB24 and Alpha8 textures that are marked readable

    using UnityEngine;


    public class TextureScale {
    private static Color[] texColors;
    private static Color[] newColors;
    private static int w;
    private static float ratioX;
    private static float ratioY;
    private static int w2;

    public static void Scale(Texture2D tex, int newWidth, int newHeight) {
    texColors = tex.GetPixels();
    newColors = new Color[newWidth * newHeight];
    ratioX = 1.0f / ((float)newWidth / (tex.width-1));
    ratioY = 1.0f / ((float)newHeight / (tex.height-1));
    w = tex.width;
    w2 = newWidth;

    BilinearScale(0, newHeight);

    tex.Resize(newWidth, newHeight);
    tex.SetPixels(newColors);
    tex.Apply();
    }

    private static void BilinearScale(int start, int end) {
    for (var y = start; y < end; y++) {
    int yFloor = (int)Mathf.Floor(y * ratioY);
    var y1 = yFloor * w;
    var y2 = (yFloor+1) * w;
    var yw = y * w2;

    for (var x = 0; x < w2; x++) {
    int xFloor = (int)Mathf.Floor(x * ratioX);
    var xLerp = x * ratioX-xFloor;
    newColors[yw + x] = ColorLerpUnclamped(ColorLerpUnclamped(texColors[y1 + xFloor], texColors[y1 + xFloor+1], xLerp),
    ColorLerpUnclamped(texColors[y2 + xFloor], texColors[y2 + xFloor+1], xLerp),
    y*ratioY-yFloor);
    }
    }
    }

    private static Color ColorLerpUnclamped (Color c1, Color c2, float value) {
    return new Color (c1.r + (c2.r - c1.r) * value,
    c1.g + (c2.g - c1.g) * value,
    c1.b + (c2.b - c1.b) * value,
    c1.a + (c2.a - c1.a) * value);
    }
    }