Масштабировать PNG в Unity5? - Баунти

Удивительно, но в Unity в течение многих лет единственный способ просто масштабировать настоящий PNG — это использовать очень замечательную библиотеку http://wiki.unity3d.com

Пример ниже

Как масштабировать PNG с помощью функций Unity5? Теперь должен быть способ с новым пользовательским интерфейсом и так далее.

Итак, масштабирование реальных пикселей (например, в 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
    }

Кстати, мне пришло в голову, что я, вероятно, говорю здесь только об уменьшении масштаба (как вам часто приходится делать, чтобы опубликовать изображение, создать что-то на лету или что-то в этом роде). по размеру изображение; это бессмысленно с точки зрения качества.


person Fattie    schedule 01.03.2016    source источник
comment
До сих пор нет встроенного способа масштабирования png с использованием функций Unity, лучше всего код в Wiki, однако можно было бы интегрировать devIL или freeimage для масштабирования или манипуляций, если требуются более сложные вещи.   -  person Chris    schedule 01.06.2016


Ответы (1)


Если у вас все в порядке с масштабированием растяжения, на самом деле есть более простой способ, используя временный 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;
}
person dkrprasetya    schedule 05.06.2017
comment
старый вопрос вновь пробуждается, а! увлекательно, я никогда не думал об этом. Интересно, какое качество? Я попробую. - person Fattie; 05.06.2017
comment
о, не увидел дату :p - person dkrprasetya; 05.06.2017
comment
не волнуйтесь! На самом деле я добавил награду - может быть, вы выиграете ее по умолчанию :) - person Fattie; 05.06.2017