Как создать изображение из байтового массива и отобразить его? - PullRequest
0 голосов
/ 15 января 2019

Я хочу получить данные из файла изображения и отобразить эту информацию в текстуре, которую может прочитать Unity.

Я могу получить информацию о пикселях в байтовом массиве, но на экране ничего не отображается. Как я могу получить изображение для отображения?

     pcxFile = File.ReadAllBytes("Assets/5_ImageParser/bagit_icon.pcx");
     int startPoint = 128;
     int height = 152; 
     int width = 152; 
     target = new Texture2D(height, width);
     for (var y = 0; y < height; y++)
     {
         for (var x = 0; x < width; x++)
         {
             timesDone ++;
             pixels[x, y] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
             startPoint += 4;
             target.SetPixel(x, y, pixels[x, y]);
         }            
     }
     target.Apply();
     target.EncodeToJPG();

1 Ответ

0 голосов
/ 15 января 2019

Ну, (при условии, что вы правильно получаете данные пикселей) вы должны присвоить созданную текстуру чему-то ...

Я бы использовал, например, RawImage , поскольку для него не требуется Sprite (как это делает компонент UI.Image - см. также Руководство по RawImage ):

// Reference this in the Inspector
public RawImage image;

//...

pcxFile = File.ReadAllBytes("Assets/5_ImageParser/bagit_icon.pcx");
int startPoint = 128;
int height = 152; 
int width = 152; 
target = new Texture2D(height, width);
for (var y = 0; y < height; y++)
{
    for (var x = 0; x < width; x++)
    {
        timesDone ++;
        pixels[x, y] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
        startPoint += 4;
        target.SetPixel(x, y, pixels[x, y]);
    }            
}
target.Apply();
// You don't need this. Only if you are also going to save it locally
// as an actual *.jpg file or if you are going to
// e.g. upload it later via http POST
//
// In this case however you would have to asign the result 
// to a variable in order to use it later
//var rawJpgBytes = target.EncodeToJPG();

// Assign the texture to the RawImage component
image.texture = target;

В качестве альтернативы для использования с обычным компонентом Image создайте Sprite из вашей текстуры, используя Sprite.Create:

// Reference this in the Inspector
public Image image;

// ...

var sprite = Sprite.Create(target, new Rect(0.0f, 0.0f, target.width, target.height), new Vector2(0.5f, 0.5f), 100.0f);

image.sprite = sprite;

Подсказка 1
Чтобы получить правильное соотношение сторон, я обычно использовал небольшую хитрость:

  1. Создать родительский объект для этого RawImage
  2. Установите желаемый «максимальный размер» в RectTransform родительского
  3. Рядом с RawImage / Image (на дочернем объекте) добавьте AspectRatioFitter (также см. AspectRatioFitter Manual ) и установите AspectMode в FitInParent.
  4. Теперь в коде настройте соотношение сторон (вы получаете его из текстуры):

    public RawImage image;
    public AspectRatioFitter fitter;
    
    //...
    
    image.texture = target;
    
    var ratio = target.width / target.height;
    fitter.aspectRatio = ratio;
    

Подсказка 2
«Дешевле» вызывать SetPixels один раз для всех пикселей, чем повторный вызов SetPixel:

// ...

startPoint = 0;
pixels = new Color[width * height]();
for(int i = 0; i < pixels.Length; i++)
{
    pixels[i] = new Color(pcxFile[startPoint], pcxFile[startPoint+1], pcxFile[startPoint+2]);
    startPoint += 4;
}

target.SetPixels(pixels);
target.Apply();

// ...

(Я не знаю, как именно работает ваш pcx формат, но, возможно, вы могли бы даже использовать LoadRawTextureData

...