AR Design
UBC EML collab with UBC SALA - visualizing IoT data in AR
VolumeImportImages.cs
Go to the documentation of this file.
1 // Copyright (c) Microsoft Corporation. All rights reserved.
2 // Licensed under the MIT License. See LICENSE in the project root for license information.
3 
4 #if UNITY_EDITOR
5 using System.Linq;
6 using System.IO;
7 using UnityEngine;
8 
9 namespace HoloToolkit.Unity
10 {
16  public static class VolumeImportImages
17  {
18  //TODO: handle textures to import as actual assets so more file support works
19  //supported formats from: https://docs.unity3d.com/430/Documentation/Components/class-Texture2D.html
20  private static readonly string[] ValidImageFileExtensions = { ".jpg", ".png" };
21  //private static readonly string[] ValidImageFileExtensions = { ".psd", ".tiff", ".jpg", ".tga", ".png", ".gif", ".bmp", ".iff", ".pict" };
22 
23  public static byte[] ConvertFolderToVolume(string folder, bool inferAlpha, out Int3 size)
24  {
25  var imageNames = GetImagesInFolder(folder);
26  size = GetSizeOfVolumeFolder(folder);
27  var voxels = new VolumeBuffer<Color32>(size);
28 
29  var tex = new Texture2D(2, 2);
30 
31  int z = 0;
32  foreach (var imageFile in imageNames)
33  {
34  bool loaded = tex.LoadImage(FileSystemHelper.ReadBytesFromLocalFile(imageFile));
35  if (!loaded)
36  {
37  Debug.LogError("Couldn't load '" + imageFile + "'...");
38  return null;
39  }
40  var fromPixels = tex.GetPixels32();
41  for (var y = 0; y < size.y; ++y)
42  {
43  for (var x = 0; x < size.x; ++x)
44  {
45  var from = fromPixels[x + (y * size.x)];
46  if (inferAlpha)
47  {
48  from.a = (byte)Mathf.Max(from.r, from.g, from.b);
49  }
50  voxels.SetVoxel(new Int3(x, y, z), from);
51  }
52  }
53  ++z;
54  }
55 
56  voxels.ClearEdges(new Color32(0, 0, 0, 0));
57  return VolumeTextureUtils.Color32ArrayToByteArray(voxels.DataArray);
58  }
59 
60  public static Int3 GetSizeOfVolumeFolder(string folder)
61  {
62  var images = GetImagesInFolder(folder);
63 
64  if (images.Length == 0)
65  {
66  return Int3.zero;
67  }
68 
69  var tex = new Texture2D(2, 2);
70  bool loaded = tex.LoadImage(FileSystemHelper.ReadBytesFromLocalFile(images.First()));
71  Debug.Assert(loaded);
72  return new Int3(tex.width, tex.height, images.Length);
73  }
74 
75  private static bool IsFileAnImage(string file)
76  {
77  var fileLower = file.ToLower();
78  return ValidImageFileExtensions.Any(k => fileLower.EndsWith(k));
79  }
80 
81  private static string[] GetImagesInFolder(string folder)
82  {
83  return Directory.GetFiles(folder)
84  .Where(k => IsFileAnImage(k))
85  .OrderBy(k => k.ToLower())
86  .ToArray();
87  }
88  }
89 }
90 #endif