public void LoadImageSubsetAsTextures(List <Image> images, ImageToColorArray[] converters, int startIndex, int endIndex, int numThreadsPerImage)
    {
        try
        {
            for (int i = startIndex; i < endIndex; i++)
            {
                Image  img       = images[i];
                Bitmap newBitmap = new Bitmap(img);

                ImageToColorArray converter = new ImageToColorArray(newBitmap, numThreadsPerImage);

                converters[i] = converter;

                converter.Convert();

                img       = null;
                newBitmap = null;
                converter = null;
            }
            System.GC.Collect();
        }
        catch (Exception e)
        {
            Debug.LogError(e);
        }
    }
    public IEnumerator LoadImagesAsTextures(List <Image> images, List <Texture2D> textures)
    {
        int numConverterThreads = 1;
        int numThreadsPerImage  = 2;

        StatusText.SetText("Stage 2: Starting threads to convert images");

        yield return(null);

        ImageToColorArray[] converters = new ImageToColorArray[images.Count];
        int numConvertersPerThread     = images.Count / numConverterThreads;

        for (int i = 0; i < numConverterThreads; i++)
        {
            int startIndex = numConvertersPerThread * i;
            int endIndex   = numConvertersPerThread * (i + 1);

            if (i == numConverterThreads - 1)
            {
                endIndex = images.Count;
            }

            Debug.LogFormat("Creating converter that starts at index {0} and ends at index {1}", startIndex, endIndex);

            ThreadPool.QueueUserWorkItem(new WaitCallback(state => LoadImageSubsetAsTextures(images, converters, startIndex, endIndex, numThreadsPerImage)));
        }

        StatusText.SetText("Stage 2: Converting images");

        yield return(null);

        for (int i = 0; i < converters.Length; i++)
        {
            while (converters[i] == null || !converters[i].IsFinished())
            {
                yield return(null);
            }
        }

        for (int i = 0; i < converters.Length; i++)
        {
            ImageToColorArray converter = converters[i];

            StatusText.SetText("Stage 3: Saving images:\n" + (i + 1) + " of " + converters.Length);

            yield return(null);

            Texture2D           newTex = new Texture2D(converter.width, converter.height);
            UnityEngine.Color[] pixels = converter.GetFinalArray();

            Debug.Log("pixels size is: " + pixels.Length);

            newTex.SetPixels(pixels);
            textures.Add(newTex);

            pixels        = null;
            converters[i] = null;
            converter     = null;
            newTex        = null;
        }

        converters = null;
        System.GC.Collect();
    }