/// <summary>
        /// Loads an image asset.
        /// </summary>
        /// <param name="path">Image path.</param>
        /// <param name="filter">Image filtering mode.</param>
        /// <param name="useCache">Should we use cache for this asset to make future loadings faster?</param>
        /// <param name="useAssetsRoot">If true, path will be relative to 'AssetsRoot'. If false, will be relative to working directory.</param>
        /// <returns>Loaded image asset.</returns>
        public ImageAsset LoadImage(string path, ImageFilterMode filter = ImageFilterMode.Nearest, bool useCache = true, bool useAssetsRoot = true)
        {
            var ret = new ImageAsset(_BonEngineBind.BON_Assets_LoadImage(ToAssetsPath(path, true, useAssetsRoot), (int)filter, useCache));

            ret.Path = path;
            return(ret);
        }
示例#2
0
        // Token: 0x060158C2 RID: 88258 RVA: 0x0057CC78 File Offset: 0x0057AE78
        public static Texture2D ResizeTexture(Texture2D pSource, ImageFilterMode pFilterMode, float pScale)
        {
            Color[]   pixels    = pSource.GetPixels(0);
            Vector2   vector    = new Vector2((float)pSource.width, (float)pSource.height);
            float     num       = (float)Mathf.RoundToInt((float)pSource.width * pScale);
            float     num2      = (float)Mathf.RoundToInt((float)pSource.height * pScale);
            Texture2D texture2D = new Texture2D((int)num, (int)num2, TextureFormat.RGBA32, false);
            int       num3      = (int)num * (int)num2;

            Color[] array   = new Color[num3];
            Vector2 vector2 = new Vector2(vector.x / num, vector.y / num2);
            Vector2 vector3 = default(Vector2);

            for (int i = 0; i < num3; i++)
            {
                float num4 = (float)i % num;
                float num5 = Mathf.Floor((float)i / num);
                vector3.x = num4 / num * vector.x;
                vector3.y = num5 / num2 * vector.y;
                if (pFilterMode == ImageFilterMode.Nearest)
                {
                    vector3.x = Mathf.Round(vector3.x);
                    vector3.y = Mathf.Round(vector3.y);
                    int num6 = (int)(vector3.y * vector.x + vector3.x);
                    array[i] = pixels[num6];
                }
                else if (pFilterMode == ImageFilterMode.Biliner)
                {
                    float t     = vector3.x - Mathf.Floor(vector3.x);
                    float t2    = vector3.y - Mathf.Floor(vector3.y);
                    int   num7  = (int)(Mathf.Floor(vector3.y) * vector.x + Mathf.Floor(vector3.x));
                    int   num8  = (int)(Mathf.Floor(vector3.y) * vector.x + Mathf.Ceil(vector3.x));
                    int   num9  = (int)(Mathf.Ceil(vector3.y) * vector.x + Mathf.Floor(vector3.x));
                    int   num10 = (int)(Mathf.Ceil(vector3.y) * vector.x + Mathf.Ceil(vector3.x));
                    array[i] = Color.Lerp(Color.Lerp(pixels[num7], pixels[num8], t), Color.Lerp(pixels[num9], pixels[num10], t), t2);
                }
                else if (pFilterMode == ImageFilterMode.Average)
                {
                    int   num11 = (int)Mathf.Max(Mathf.Floor(vector3.x - vector2.x * 0.5f), 0f);
                    int   num12 = (int)Mathf.Min(Mathf.Ceil(vector3.x + vector2.x * 0.5f), vector.x);
                    int   num13 = (int)Mathf.Max(Mathf.Floor(vector3.y - vector2.y * 0.5f), 0f);
                    int   num14 = (int)Mathf.Min(Mathf.Ceil(vector3.y + vector2.y * 0.5f), vector.y);
                    Color a     = default(Color);
                    float num15 = 0f;
                    for (int j = num13; j < num14; j++)
                    {
                        for (int k = num11; k < num12; k++)
                        {
                            a     += pixels[(int)((float)j * vector.x + (float)k)];
                            num15 += 1f;
                        }
                    }
                    array[i] = a / num15;
                }
            }
            texture2D.SetPixels(array);
            texture2D.Apply();
            return(texture2D);
        }
示例#3
0
    // http://blog.collectivemass.com/2014/03/resizing-textures-in-unity/
    public static Texture2D ResizeTexture(Texture2D pSource, ImageFilterMode pFilterMode, float pScale)
    {
        //*** Variables
        int i;

        //*** Get All the source pixels
        Color[] aSourceColor = pSource.GetPixels(0);
        Vector2 vSourceSize  = new Vector2(pSource.width, pSource.height);

        //*** Calculate New Size
        float xWidth  = Mathf.RoundToInt((float)pSource.width * pScale);
        float xHeight = Mathf.RoundToInt((float)pSource.height * pScale);

        //*** Make New
        Texture2D oNewTex = new Texture2D((int)xWidth, (int)xHeight, TextureFormat.RGBA32, false);

        //*** Make destination array
        int xLength = (int)xWidth * (int)xHeight;

        Color[] aColor = new Color[xLength];

        Vector2 vPixelSize = new Vector2(vSourceSize.x / xWidth, vSourceSize.y / xHeight);

        //*** Loop through destination pixels and process
        Vector2 vCenter = new Vector2();

        for (i = 0; i < xLength; i++)
        {
            //*** Figure out x&y
            float xX = (float)i % xWidth;
            float xY = Mathf.Floor((float)i / xWidth);

            //*** Calculate Center
            vCenter.x = (xX / xWidth) * vSourceSize.x;
            vCenter.y = (xY / xHeight) * vSourceSize.y;

            //*** Do Based on mode
            //*** Nearest neighbour (testing)
            if (pFilterMode == ImageFilterMode.Nearest)
            {
                //*** Nearest neighbour (testing)
                vCenter.x = Mathf.Round(vCenter.x);
                vCenter.y = Mathf.Round(vCenter.y);

                //*** Calculate source index
                int xSourceIndex = (int)((vCenter.y * vSourceSize.x) + vCenter.x);

                //*** Copy Pixel
                aColor[i] = aSourceColor[xSourceIndex];
            }

            //*** Bilinear
            else if (pFilterMode == ImageFilterMode.Biliner)
            {
                //*** Get Ratios
                float xRatioX = vCenter.x - Mathf.Floor(vCenter.x);
                float xRatioY = vCenter.y - Mathf.Floor(vCenter.y);

                //*** Get Pixel index's
                int xIndexTL = (int)((Mathf.Floor(vCenter.y) * vSourceSize.x) + Mathf.Floor(vCenter.x));
                int xIndexTR = (int)((Mathf.Floor(vCenter.y) * vSourceSize.x) + Mathf.Ceil(vCenter.x));
                int xIndexBL = (int)((Mathf.Ceil(vCenter.y) * vSourceSize.x) + Mathf.Floor(vCenter.x));
                int xIndexBR = (int)((Mathf.Ceil(vCenter.y) * vSourceSize.x) + Mathf.Ceil(vCenter.x));

                //*** Calculate Color
                aColor[i] = Color.Lerp(
                    Color.Lerp(aSourceColor[xIndexTL], aSourceColor[xIndexTR], xRatioX),
                    Color.Lerp(aSourceColor[xIndexBL], aSourceColor[xIndexBR], xRatioX),
                    xRatioY
                    );
            }

            //*** Average
            else if (pFilterMode == ImageFilterMode.Average)
            {
                //*** Calculate grid around point
                int xXFrom = (int)Mathf.Max(Mathf.Floor(vCenter.x - (vPixelSize.x * 0.5f)), 0);
                int xXTo   = (int)Mathf.Min(Mathf.Ceil(vCenter.x + (vPixelSize.x * 0.5f)), vSourceSize.x);
                int xYFrom = (int)Mathf.Max(Mathf.Floor(vCenter.y - (vPixelSize.y * 0.5f)), 0);
                int xYTo   = (int)Mathf.Min(Mathf.Ceil(vCenter.y + (vPixelSize.y * 0.5f)), vSourceSize.y);

                //*** Loop and accumulate
                Vector4 oColorTotal = new Vector4();
                Color   oColorTemp  = new Color();
                float   xGridCount  = 0;
                for (int iy = xYFrom; iy < xYTo; iy++)
                {
                    for (int ix = xXFrom; ix < xXTo; ix++)
                    {
                        //*** Get Color
                        oColorTemp += aSourceColor[(int)(((float)iy * vSourceSize.x) + ix)];

                        //*** Sum
                        xGridCount++;
                    }
                }

                //*** Average Color
                aColor[i] = oColorTemp / (float)xGridCount;
            }
        }

        //*** Set Pixels
        oNewTex.SetPixels(aColor);
        oNewTex.Apply();

        //*** Return
        return(oNewTex);
    }
示例#4
0
    public static Texture2D ResizeTexture(Texture2D src, ImageFilterMode mode, int nw, int nh)
    {
        Color[] srcColors = src.GetPixels();

        int srcWidth  = src.width;
        int srcHeight = src.height;

        Texture2D newTex = new Texture2D(nw, nh, TextureFormat.RGBA32, false);

        int length = nw * nh;

        Color[] tgColors = new Color[length];

        Vector2 pixelSize = new Vector2((float)srcWidth / nw, (float)srcHeight / nh);

        Vector2 center = new Vector2();

        for (int i = 0; i < length; i++)
        {
            float x = (float)i % nw;
            float y = Mathf.Floor((float)i / nw);

            center.x = (x / nw) * srcWidth;
            center.y = (y / nh) * srcHeight;

            // Nearest neighbour
            if (mode == ImageFilterMode.Nearest)
            {
                center.x = Mathf.Round(center.x);
                center.y = Mathf.Round(center.y);

                int index = (int)((center.y * srcWidth) + center.x);
                tgColors[i] = srcColors[index];
            }

            // Bilinear
            else if (mode == ImageFilterMode.Bilinear)
            {
                // Get Ratios
                float rx = center.x - Mathf.Floor(center.x);
                float ry = center.y - Mathf.Floor(center.y);

                // Get Pixel Index
                int indexTL = (int)((Mathf.Floor(center.y) * srcWidth) + Mathf.Floor(center.x));
                int indexTR = (int)((Mathf.Floor(center.y) * srcWidth) + Mathf.Ceil(center.x));
                int indexBL = (int)((Mathf.Ceil(center.y) * srcWidth) + Mathf.Floor(center.x));
                int indexBR = (int)((Mathf.Ceil(center.y) * srcWidth) + Mathf.Ceil(center.x));

                tgColors[i] = Color.Lerp(
                    Color.Lerp(srcColors[indexTL], srcColors[indexTR], rx),
                    Color.Lerp(srcColors[indexBL], srcColors[indexBR], rx),
                    ry
                    );
            }
            else if (mode == ImageFilterMode.Average)
            {
                // Calculate grid around point
                int xFrom = (int)Mathf.Max(Mathf.Floor(center.x - (pixelSize.x * 0.5f)), 0);
                int xTo   = (int)Mathf.Max(Mathf.Ceil(center.x - (pixelSize.x * 0.5f)), srcWidth);
                int yFrom = (int)Mathf.Max(Mathf.Floor(center.y - (pixelSize.y * 0.5f)), 0);
                int yTo   = (int)Mathf.Max(Mathf.Ceil(center.y + (pixelSize.y * 0.5f)), srcHeight);

                // Loop and Accumulate
                Color cTemp      = new Color();
                float xGridCount = 0;

                for (int iy = yFrom; iy < yTo; iy++)
                {
                    for (int ix = xFrom; ix < xTo; ix++)
                    {
                        cTemp += srcColors[(int)(((float)iy * srcWidth) + ix)];

                        xGridCount++;
                    }
                }

                // Average Color
                tgColors[i] = cTemp / (float)xGridCount;
            }
        }

        newTex.SetPixels(tgColors);
        newTex.Apply();

        return(newTex);
    }
        private void Resize(Object[] aTextures, FolderConvention pFolderConvention)
        {
            //*** Variables
            Texture2D oTexture;
            string    xAssetFolder  = "Assets";
            string    xSpriteFolder = "Sprites";
            string    xFinalPath    = "";
            int       i;

            string[]        aTK2D    = new string[] { "@4x", "@2x", "@1x" };
            string[]        aFolders = new string[] { "Full", "Half", "Quater" };
            float[]         aSizes   = new float[] { 1, 0.5f, 0.25f };
            ImageFilterMode oMode    = ImageFilterMode.Average;


            //*** Get Base Path
            string xBasePath = Application.dataPath;

            xBasePath = xBasePath.Substring(0, xBasePath.Length - xAssetFolder.Length);


            //*** Loop through selected textures
            foreach (Object oObject in aTextures)
            {
                //*** Cast
                oTexture = oObject as Texture2D;

                //*** IF it is a valid texture
                if (oTexture != null)
                {
                    //*** Get Asset Path
                    string xAssetPath = AssetDatabase.GetAssetPath(oTexture);
                    string xPath      = Path.GetDirectoryName(xAssetPath);
                    string xNewPath   = xPath + Path.DirectorySeparatorChar + xSpriteFolder + Path.DirectorySeparatorChar;

                    //*** If TK2d
                    if (pFolderConvention == FolderConvention.TK2D)
                    {
                        //*** If Folder Does not exist
                        if (!System.IO.Directory.Exists(xBasePath + xNewPath))
                        {
                            //*** Make it
                            AssetDatabase.CreateFolder(xPath, xSpriteFolder);

                            //*** Refresh
                            AssetDatabase.Refresh();
                        }
                    }

                    //*** If Set Folders
                    else if (pFolderConvention == FolderConvention.FoldersPerSize)
                    {
                        //*** Loop through sizes
                        for (i = 0; i < aFolders.Length; i++)
                        {
                            //*** If Folder Does not exist
                            if (!System.IO.Directory.Exists(xBasePath + xPath + Path.DirectorySeparatorChar + aFolders[i] + Path.DirectorySeparatorChar))
                            {
                                //*** Make it
                                AssetDatabase.CreateFolder(xPath, aFolders[i]);

                                //*** Refresh
                                AssetDatabase.Refresh();
                            }
                        }
                    }

                    //*** Get Importer data
                    TextureImporter oTI = TextureImporter.GetAtPath(xAssetPath) as TextureImporter;

                    //*** If Not Readable, set
                    if (!oTI.isReadable)
                    {
                        oTI.isReadable = true;

                        //*** Apply Settings & Reload
                        AssetDatabase.ImportAsset(xAssetPath, ImportAssetOptions.ForceUpdate);
                    }

                    //*** Get All the source pixels
                    Color[] aSourceColor = oTexture.GetPixels(0);
                    Vector2 vSourceSize  = new Vector2(oTexture.width, oTexture.height);

                    //*** Loop through sizes
                    for (i = 0; i < aFolders.Length; i++)
                    {
                        //*** Make New Paths
                        string xNewAssetPath = xNewPath + Path.GetFileName(xAssetPath);

                        //*** Strip Extra File Extention Data
                        if (stripExtraFileExtentions)
                        {
                            List <string> aNewAssetPath = new List <string>(xNewAssetPath.Split(new char[] { '.' }, System.StringSplitOptions.RemoveEmptyEntries));

                            //*** If Has an extention, remove last
                            if (aNewAssetPath.Count > 1)
                            {
                                aNewAssetPath.RemoveAt(aNewAssetPath.Count - 1);
                            }

                            //*** Make join back together
                            //xNewAssetPath = xNewPath + string.Join(".", aNewAssetPath.ToArray());
                            xNewAssetPath = string.Join(".", aNewAssetPath.ToArray());
                        }

                        //*** Calculate New Size
                        float xWidth  = (int)Mathf.Round((float)oTexture.width * aSizes[i]);
                        float xHeight = (int)Mathf.Round((float)oTexture.height * aSizes[i]);

                        //*** Make New
                        Texture2D oNewTex = new Texture2D((int)xWidth, (int)xHeight, TextureFormat.RGBA32, false);

                        //*** Make destination array
                        int     xLength = (int)xWidth * (int)xHeight;
                        Color[] aColor  = new Color[xLength];

                        Vector2 vPixelSize = new Vector2(vSourceSize.x / xWidth, vSourceSize.y / xHeight);

                        //*** If Not a resize but a copy
                        if (aSizes[i] == 1)
                        {
                            //*** Just get pixels
                            aColor = aSourceColor;
                        }

                        //*** If Needs resizing
                        else
                        {
                            //*** Loop through destination pixels and process
                            int     ii;
                            Vector2 vCenter = new Vector2();
                            for (ii = 0; ii < xLength; ii++)
                            {
                                //*** Figure out x&y
                                float xX = (float)ii % xWidth;
                                float xY = Mathf.Floor((float)ii / xWidth);

                                //*** Calculate Center
                                vCenter.x = (xX / xWidth) * vSourceSize.x;
                                vCenter.y = (xY / xHeight) * vSourceSize.y;


                                //*** Do Based on mode
                                //*** Nearest neighbour (testing)
                                if (oMode == ImageFilterMode.Nearest)
                                {
                                    //*** Nearest neighbour (testing)
                                    vCenter.x = Mathf.Round(vCenter.x);
                                    vCenter.y = Mathf.Round(vCenter.y);

                                    //*** Calculate source index
                                    int xSourceIndex = (int)((vCenter.y * vSourceSize.x) + vCenter.x);

                                    //*** Copy Pixel
                                    aColor[ii] = aSourceColor[xSourceIndex];
                                }

                                //*** Bilinear
                                else if (oMode == ImageFilterMode.Biliner)
                                {
                                    //*** Get Ratios
                                    float xRatioX = vCenter.x - Mathf.Floor(vCenter.x);
                                    float xRatioY = vCenter.y - Mathf.Floor(vCenter.y);

                                    //*** Get Pixel index's
                                    int xIndexTL = (int)((Mathf.Floor(vCenter.y) * vSourceSize.x) + Mathf.Floor(vCenter.x));
                                    int xIndexTR = (int)((Mathf.Floor(vCenter.y) * vSourceSize.x) + Mathf.Ceil(vCenter.x));
                                    int xIndexBL = (int)((Mathf.Ceil(vCenter.y) * vSourceSize.x) + Mathf.Floor(vCenter.x));
                                    int xIndexBR = (int)((Mathf.Ceil(vCenter.y) * vSourceSize.x) + Mathf.Ceil(vCenter.x));

                                    //*** Calculate Color
                                    aColor[ii] = Color.Lerp(
                                        Color.Lerp(aSourceColor[xIndexTL], aSourceColor[xIndexTR], xRatioX),
                                        Color.Lerp(aSourceColor[xIndexBL], aSourceColor[xIndexBR], xRatioX),
                                        xRatioY
                                        );
                                }

                                //*** Average
                                else if (oMode == ImageFilterMode.Average)
                                {
                                    //*** Calculate grid
                                    int xXFrom = (int)Mathf.Max(Mathf.Floor(vCenter.x - (vPixelSize.x * 0.5f)), 0);
                                    int xXTo   = (int)Mathf.Min(Mathf.Ceil(vCenter.x + (vPixelSize.x * 0.5f)), vSourceSize.x);
                                    int xYFrom = (int)Mathf.Max(Mathf.Floor(vCenter.y - (vPixelSize.y * 0.5f)), 0);
                                    int xYTo   = (int)Mathf.Min(Mathf.Ceil(vCenter.y + (vPixelSize.y * 0.5f)), vSourceSize.y);

                                    //*** Loop and accumulate
                                    Vector4 oColorTotal = new Vector4();
                                    Color   oColorTemp  = new Color();
                                    float   xGridCount  = 0;
                                    for (int iy = xYFrom; iy < xYTo; iy++)
                                    {
                                        for (int ix = xXFrom; ix < xXTo; ix++)
                                        {
                                            //*** Get Color
                                            oColorTemp += aSourceColor[(int)(((float)iy * vSourceSize.x) + ix)];

                                            //*** Sum
                                            xGridCount++;
                                        }
                                    }

                                    //*** Average Color
                                    aColor[ii] = oColorTemp / (float)xGridCount;
                                }
                            }
                        }

                        //*** Set Pixels
                        oNewTex.SetPixels(aColor);
                        oNewTex.Apply();

                        //*** if TK2D
                        if (pFolderConvention == FolderConvention.TK2D)
                        {
                            if (stripExtraFileExtentions)
                            {
                                xFinalPath = xBasePath + xNewAssetPath + aTK2D[i] + ".png";
                            }
                            else
                            {
                                xFinalPath = xBasePath + xNewAssetPath + "." + aTK2D[i] + ".png";
                            }
                        }

                        //*** If Sepearte Folders
                        else if (pFolderConvention == FolderConvention.FoldersPerSize)
                        {
                            xFinalPath = xBasePath + xPath + Path.DirectorySeparatorChar + aFolders[i] + Path.DirectorySeparatorChar + oTexture.name + ".png";
                        }

                        //*** Encode and save
                        byte[] aData = oNewTex.EncodeToPNG();
                        File.WriteAllBytes(xFinalPath, aData);

                        //*** Open New Asset

                        //*** Set Texture
                    }
                }
            }

            //*** Refresh
            AssetDatabase.Refresh();
        }
示例#6
0
        /// <summary>
        /// Creates an empty image.
        /// </summary>
        /// <param name="size">Image size.</param>
        /// <param name="filter">Image filtering mode.</param>
        /// <returns>Loaded image asset.</returns>
        public ImageAsset CreateEmptyImage(PointI size, ImageFilterMode filter = ImageFilterMode.Nearest)
        {
            var ret = new ImageAsset(_BonEngineBind.BON_Assets_CreateEmptyImage(size.X, size.Y, (int)filter));

            return(ret);
        }
示例#7
0
        /// <summary>
        /// Loads an image asset.
        /// </summary>
        /// <param name="filename">Image path.</param>
        /// <param name="filter">Image filtering mode.</param>
        /// <param name="useCache">Should we use cache for this asset to make future loadings faster?</param>
        /// <returns>Loaded image asset.</returns>
        public ImageAsset LoadImage(string filename, ImageFilterMode filter = ImageFilterMode.Nearest, bool useCache = true)
        {
            var ret = new ImageAsset(_BonEngineBind.BON_Assets_LoadImage(ToAssetsPath(filename, true), (int)filter, useCache));

            return(ret);
        }
示例#8
0
    //压缩图片
    public static Texture2D ResizeTexture(Texture2D pSource, ImageFilterMode pFilterMode, Vector2 newSize)
    {
        int i;

        Color[] aSourceColor = pSource.GetPixels(0);
        Vector2 vSourceSize  = new Vector2(pSource.width, pSource.height);

        float xWidth  = Mathf.RoundToInt(newSize.x);
        float xHeight = Mathf.RoundToInt(newSize.y);

        Texture2D oNewTex = new Texture2D((int)xWidth, (int)xHeight, TextureFormat.RGBA32, false);

        int xLength = (int)xWidth * (int)xHeight;

        Color[] aColor = new Color[xLength];

        Vector2 vPixelSize = new Vector2(vSourceSize.x / xWidth, vSourceSize.y / xHeight);

        Vector2 vCenter = new Vector2();

        for (i = 0; i < xLength; i++)
        {
            float xX = (float)i % xWidth;
            float xY = Mathf.Floor((float)i / xWidth);

            vCenter.x = (xX / xWidth) * vSourceSize.x;
            vCenter.y = (xY / xHeight) * vSourceSize.y;

            if (pFilterMode == ImageFilterMode.Nearest)
            {
                vCenter.x = Mathf.Round(vCenter.x);
                vCenter.y = Mathf.Round(vCenter.y);

                int xSourceIndex = (int)((vCenter.y * vSourceSize.x) + vCenter.x);

                aColor[i] = aSourceColor[xSourceIndex];
            }

            else if (pFilterMode == ImageFilterMode.Biliner)
            {
                float xRatioX = vCenter.x - Mathf.Floor(vCenter.x);
                float xRatioY = vCenter.y - Mathf.Floor(vCenter.y);

                int xIndexTL = (int)((Mathf.Floor(vCenter.y) * vSourceSize.x) + Mathf.Floor(vCenter.x));
                int xIndexTR = (int)((Mathf.Floor(vCenter.y) * vSourceSize.x) + Mathf.Ceil(vCenter.x));
                int xIndexBL = (int)((Mathf.Ceil(vCenter.y) * vSourceSize.x) + Mathf.Floor(vCenter.x));
                int xIndexBR = (int)((Mathf.Ceil(vCenter.y) * vSourceSize.x) + Mathf.Ceil(vCenter.x));

                aColor[i] = Color.Lerp(
                    Color.Lerp(aSourceColor[xIndexTL], aSourceColor[xIndexTR], xRatioX),
                    Color.Lerp(aSourceColor[xIndexBL], aSourceColor[xIndexBR], xRatioX),
                    xRatioY
                    );
            }

            else if (pFilterMode == ImageFilterMode.Average)
            {
                int xXFrom = (int)Mathf.Max(Mathf.Floor(vCenter.x - (vPixelSize.x * 0.5f)), 0);
                int xXTo   = (int)Mathf.Min(Mathf.Ceil(vCenter.x + (vPixelSize.x * 0.5f)), vSourceSize.x);
                int xYFrom = (int)Mathf.Max(Mathf.Floor(vCenter.y - (vPixelSize.y * 0.5f)), 0);
                int xYTo   = (int)Mathf.Min(Mathf.Ceil(vCenter.y + (vPixelSize.y * 0.5f)), vSourceSize.y);

                Vector4 oColorTotal = new Vector4();
                Color   oColorTemp  = new Color();
                float   xGridCount  = 0;
                for (int iy = xYFrom; iy < xYTo; iy++)
                {
                    for (int ix = xXFrom; ix < xXTo; ix++)
                    {
                        oColorTemp += aSourceColor[(int)(((float)iy * vSourceSize.x) + ix)];

                        xGridCount++;
                    }
                }

                aColor[i] = oColorTemp / (float)xGridCount;
            }
        }

        oNewTex.SetPixels(aColor);
        oNewTex.Apply();
        return(oNewTex);
    }
        public Texture2D ResizeTexture(Texture2D originalTexture, ImageFilterMode filterMode, int newWidth, int newHeight)
        {
            //*** Get All the source pixels
            Color[] sourceColor = originalTexture.GetPixels(0);
            Vector2 sourceSize  = new Vector2(originalTexture.width, originalTexture.height);

            //*** Calculate New Size
            float textureWidth  = newWidth;
            float textureHeight = newHeight;

            //*** Make New
            Texture2D newTexture = new Texture2D((int)textureWidth, (int)textureHeight, TextureFormat.RGBA32, false);

            //*** Make destination array
            Color[] aColor = new Color[(int)textureWidth * (int)textureHeight];

            Vector2 pixelSize = new Vector2(sourceSize.x / textureWidth, sourceSize.y / textureHeight);

            //*** Loop through destination pixels and process
            Vector2 center = new Vector2();

            for (int i = 0; i < aColor.Length; i++)
            {
                //*** Figure out x&y
                float x = (float)i % textureWidth;
                float y = Mathf.Floor((float)i / textureWidth);

                //*** Calculate Center
                center.x = (x / textureWidth) * sourceSize.x;
                center.y = (y / textureHeight) * sourceSize.y;

                //*** Do Based on mode
                //*** Nearest neighbour (testing)
                if (filterMode == ImageFilterMode.Nearest)
                {
                    //*** Nearest neighbour (testing)
                    center.x = Mathf.Round(center.x);
                    center.y = Mathf.Round(center.y);

                    //*** Calculate source index
                    int sourceIndex = (int)((center.y * sourceSize.x) + center.x);

                    //*** Copy Pixel
                    aColor[i] = sourceColor[sourceIndex];
                }

                //*** Bilinear
                else if (filterMode == ImageFilterMode.Bilinear)
                {
                    //*** Get Ratios
                    float ratioX = center.x - Mathf.Floor(center.x);
                    float ratioY = center.y - Mathf.Floor(center.y);

                    //*** Get Pixel index's
                    int indexTL = (int)((Mathf.Floor(center.y) * sourceSize.x) + Mathf.Floor(center.x));
                    int indexTR = (int)((Mathf.Floor(center.y) * sourceSize.x) + Mathf.Ceil(center.x));
                    int indexBL = (int)((Mathf.Ceil(center.y) * sourceSize.x) + Mathf.Floor(center.x));
                    int indexBR = (int)((Mathf.Ceil(center.y) * sourceSize.x) + Mathf.Ceil(center.x));

                    //*** Calculate Color
                    aColor[i] = Color.Lerp(
                        Color.Lerp(sourceColor[indexTL], sourceColor[indexTR], ratioX),
                        Color.Lerp(sourceColor[indexBL], sourceColor[indexBR], ratioX),
                        ratioY
                        );
                }

                //*** Average
                else if (filterMode == ImageFilterMode.Average)
                {
                    //*** Calculate grid around point
                    int xFrom = (int)Mathf.Max(Mathf.Floor(center.x - (pixelSize.x * 0.5f)), 0);
                    int xTo   = (int)Mathf.Min(Mathf.Ceil(center.x + (pixelSize.x * 0.5f)), sourceSize.x);
                    int yFrom = (int)Mathf.Max(Mathf.Floor(center.y - (pixelSize.y * 0.5f)), 0);
                    int yTo   = (int)Mathf.Min(Mathf.Ceil(center.y + (pixelSize.y * 0.5f)), sourceSize.y);

                    //*** Loop and accumulate
                    Color tempColor  = new Color();
                    float xGridCount = 0;
                    for (int iy = yFrom; iy < yTo; iy++)
                    {
                        for (int ix = xFrom; ix < xTo; ix++)
                        {
                            //*** Get Color
                            tempColor += sourceColor[(int)(((float)iy * sourceSize.x) + ix)];

                            //*** Sum
                            xGridCount++;
                        }
                    }

                    //*** Average Color
                    aColor[i] = tempColor / (float)xGridCount;
                }
            }

            //*** Set Pixels
            newTexture.SetPixels(aColor);
            newTexture.Apply();

            //*** Return
            return(newTexture);
        }
示例#10
0
    public static Texture2D ResizeTexture(Texture2D pSource, ImageFilterMode pFilterMode, float pScale)
    {
        //*** Variables
        int i;

        //*** Get All the source pixels
        Color[] aSourceColor = pSource.GetPixels(0);
        Vector2 vSourceSize = new Vector2(pSource.width, pSource.height);

        //*** Calculate New Size
        float xWidth = Mathf.RoundToInt((float)pSource.width * pScale);
        float xHeight = Mathf.RoundToInt((float)pSource.height * pScale);

        //*** Make New
        Texture2D oNewTex = new Texture2D((int)xWidth, (int)xHeight, TextureFormat.RGBA32, false);

        //*** Make destination array
        int xLength = (int)xWidth * (int)xHeight;
        Color[] aColor = new Color[xLength];

        Vector2 vPixelSize = new Vector2(vSourceSize.x / xWidth, vSourceSize.y / xHeight);

        //*** Loop through destination pixels and process
        Vector2 vCenter = new Vector2();
        for(i=0; i<xLength; i++){

            //*** Figure out x&y
            float xX = (float)i % xWidth;
            float xY = Mathf.Floor((float)i / xWidth);

            //*** Calculate Center
            vCenter.x = (xX / xWidth) * vSourceSize.x;
            vCenter.y = (xY / xHeight) * vSourceSize.y;

            //*** Do Based on mode
            //*** Nearest neighbour (testing)
            if(pFilterMode == ImageFilterMode.Nearest){

                //*** Nearest neighbour (testing)
                vCenter.x = Mathf.Round(vCenter.x);
                vCenter.y = Mathf.Round(vCenter.y);

                //*** Calculate source index
                int xSourceIndex = (int)((vCenter.y * vSourceSize.x) + vCenter.x);

                //*** Copy Pixel
                if(xSourceIndex<aSourceColor.Length)aColor[i] = aSourceColor[xSourceIndex];
            }

            //*** Bilinear
            else if(pFilterMode == ImageFilterMode.Biliner){

                //*** Get Ratios
                float xRatioX = vCenter.x - Mathf.Floor(vCenter.x);
                float xRatioY = vCenter.y - Mathf.Floor(vCenter.y);

                //*** Get Pixel index's
                int xIndexTL = (int)((Mathf.Floor(vCenter.y) * vSourceSize.x) + Mathf.Floor(vCenter.x));
                int xIndexTR = (int)((Mathf.Floor(vCenter.y) * vSourceSize.x) + Mathf.Ceil(vCenter.x));
                int xIndexBL = (int)((Mathf.Ceil(vCenter.y) * vSourceSize.x) + Mathf.Floor(vCenter.x));
                int xIndexBR = (int)((Mathf.Ceil(vCenter.y) * vSourceSize.x) + Mathf.Ceil(vCenter.x));

                //*** Calculate Color
                aColor[i] = Color.Lerp(
                    Color.Lerp(aSourceColor[xIndexTL], aSourceColor[xIndexTR], xRatioX),
                    Color.Lerp(aSourceColor[xIndexBL], aSourceColor[xIndexBR], xRatioX),
                    xRatioY
                    );
            }

            //*** Average
            else if(pFilterMode == ImageFilterMode.Average){

                //*** Calculate grid around point
                int xXFrom = (int)Mathf.Max(Mathf.Floor(vCenter.x - (vPixelSize.x * 0.5f)), 0);
                int xXTo = (int)Mathf.Min(Mathf.Ceil(vCenter.x + (vPixelSize.x * 0.5f)), vSourceSize.x);
                int xYFrom = (int)Mathf.Max(Mathf.Floor(vCenter.y - (vPixelSize.y * 0.5f)), 0);
                int xYTo = (int)Mathf.Min(Mathf.Ceil(vCenter.y + (vPixelSize.y * 0.5f)), vSourceSize.y);

                //*** Loop and accumulate
                Vector4 oColorTotal = new Vector4();
                Color oColorTemp = new Color();
                float xGridCount = 0;
                for(int iy = xYFrom; iy < xYTo; iy++){
                    for(int ix = xXFrom; ix < xXTo; ix++){

                        //*** Get Color
                        oColorTemp += aSourceColor[(int)(((float)iy * vSourceSize.x) + ix)];

                        //*** Sum
                        xGridCount++;
                    }
                }

                //*** Average Color
                aColor[i] = oColorTemp / (float)xGridCount;
            }
        }

        //*** Set Pixels
        oNewTex.SetPixels(aColor);
        oNewTex.Apply();

        //*** Return
        return oNewTex;
    }