public byte[] GetSpriteFromAtlas(UISpriteData es) { if (m_tet2dAtlasImage == null) { return(null); } m_iWidthMin = Mathf.Clamp(es.x, 0, m_iAtlasImageWidth); m_iHeightMin = Mathf.Clamp(es.y, 0, m_iAtlasImageHeight); m_iWidthMax = Mathf.Min(m_iWidthMin + es.width, m_iAtlasImageWidth - 1); m_iHeightMax = Mathf.Min(m_iHeightMin + es.height, m_iAtlasImageHeight - 1); m_iNewWidth = Mathf.Clamp(es.width, 0, m_iAtlasImageWidth); m_iNewHeight = Mathf.Clamp(es.height, 0, m_iAtlasImageHeight); if (m_iNewWidth == 0 || m_iNewHeight == 0) { return(null); } m_c32arrNewPixels = new Color32[m_iNewWidth * m_iNewHeight]; for (int y = 0; y < m_iNewHeight; ++y) { m_iCopyHeight = m_iHeightMin + y; if (m_iCopyHeight > m_iHeightMax) { m_iCopyHeight = m_iHeightMax; } for (int x = 0; x < m_iNewWidth; ++x) { m_iCopyWidth = m_iWidthMin + x; if (m_iCopyWidth > m_iWidthMax) { m_iCopyWidth = m_iWidthMax; } int newIndex = (m_iNewHeight - 1 - y) * m_iNewWidth + x; int oldIndex = (m_iAtlasImageHeight - 1 - m_iCopyHeight) * m_iAtlasImageWidth + m_iCopyWidth; m_c32arrNewPixels[newIndex] = m_carrAtlasImage[oldIndex]; } } m_spriteEntry = new UIAtlasMaker.SpriteEntry(); m_spriteEntry.CopyFrom(es); m_spriteEntry.SetRect(0, 0, m_iNewWidth, m_iNewHeight); m_spriteEntry.temporaryTexture = true; m_spriteEntry.tex = new Texture2D(m_iNewWidth, m_iNewHeight); m_spriteEntry.tex.SetPixels32(m_c32arrNewPixels); m_spriteEntry.tex.Apply(); m_c32arrNewPixels = null; return(m_spriteEntry.tex.EncodeToPNG()); }
/// <summary> /// 从图集纹理中分解特定的sprite /// </summary> SpriteEntry ExtractSprite(UISpriteData es, Color32[] oldPixels, int oldWidth, int oldHeight) { int xmin = Mathf.Clamp(es.x, 0, oldWidth); int ymin = Mathf.Clamp(es.y, 0, oldHeight); int xmax = Mathf.Min(xmin + es.width, oldWidth - 1); int ymax = Mathf.Min(ymin + es.height, oldHeight - 1); int newWidth = Mathf.Clamp(es.width, 0, oldWidth); int newHeight = Mathf.Clamp(es.height, 0, oldHeight); if (newWidth == 0 || newHeight == 0) { return(null); } Color32[] newPixels = new Color32[newWidth * newHeight]; for (int y = 0; y < newHeight; ++y) { int cy = ymin + y; if (cy > ymax) { cy = ymax; } for (int x = 0; x < newWidth; ++x) { int cx = xmin + x; if (cx > xmax) { cx = xmax; } int newIndex = (newHeight - 1 - y) * newWidth + x; int oldIndex = (oldHeight - 1 - cy) * oldWidth + cx; newPixels[newIndex] = oldPixels[oldIndex]; } } // Create a new sprite SpriteEntry sprite = new SpriteEntry(); sprite.CopyFrom(es); sprite.SetRect(0, 0, newWidth, newHeight); sprite.SetTexture(newPixels, newWidth, newHeight); return(sprite); }
static public List <UIAtlasMaker.SpriteEntry> CreateSprites(List <Texture> textures) { List <UIAtlasMaker.SpriteEntry> list = new List <UIAtlasMaker.SpriteEntry>(); foreach (Texture tex in textures) { Texture2D oldTex = NGUIEditorTools.ImportTexture(tex, true, false, true); if (oldTex == null) { oldTex = tex as Texture2D; } if (oldTex == null) { continue; } // If we aren't doing trimming, just use the texture as-is if (!NGUISettings.atlasTrimming && !NGUISettings.atlasPMA) { UIAtlasMaker.SpriteEntry sprite = new UIAtlasMaker.SpriteEntry(); sprite.SetRect(0, 0, oldTex.width, oldTex.height); sprite.tex = oldTex; if (oldTex.name.EndsWith("zoomed")) { sprite.name = oldTex.name.Substring(0, oldTex.name.Length - "zoomed".Length); } else { sprite.name = oldTex.name; } sprite.temporaryTexture = false; list.Add(sprite); continue; } #region 屏蔽NGUI设定项 // If we want to trim transparent pixels, there is more work to be done Color32[] pixels = oldTex.GetPixels32(); int xmin = oldTex.width; int xmax = 0; int ymin = oldTex.height; int ymax = 0; int oldWidth = oldTex.width; int oldHeight = oldTex.height; // Find solid pixels if (NGUISettings.atlasTrimming) { for (int y = 0, yw = oldHeight; y < yw; ++y) { for (int x = 0, xw = oldWidth; x < xw; ++x) { Color32 c = pixels[y * xw + x]; if (c.a != 0) { if (y < ymin) { ymin = y; } if (y > ymax) { ymax = y; } if (x < xmin) { xmin = x; } if (x > xmax) { xmax = x; } } } } } else { xmin = 0; xmax = oldWidth - 1; ymin = 0; ymax = oldHeight - 1; } int newWidth = (xmax - xmin) + 1; int newHeight = (ymax - ymin) + 1; if (newWidth > 0 && newHeight > 0) { UIAtlasMaker.SpriteEntry sprite = new UIAtlasMaker.SpriteEntry(); sprite.x = 0; sprite.y = 0; sprite.width = oldTex.width; sprite.height = oldTex.height; // If the dimensions match, then nothing was actually trimmed if (!NGUISettings.atlasPMA && (newWidth == oldWidth && newHeight == oldHeight)) { sprite.tex = oldTex; if (oldTex.name.EndsWith("zoomed")) { sprite.name = oldTex.name.Substring(0, oldTex.name.Length - "zoomed".Length); } else { sprite.name = oldTex.name; } sprite.temporaryTexture = false; } else { // Copy the non-trimmed texture data into a temporary buffer Color32[] newPixels = new Color32[newWidth * newHeight]; for (int y = 0; y < newHeight; ++y) { for (int x = 0; x < newWidth; ++x) { int newIndex = y * newWidth + x; int oldIndex = (ymin + y) * oldWidth + (xmin + x); if (NGUISettings.atlasPMA) { newPixels[newIndex] = NGUITools.ApplyPMA(pixels[oldIndex]); } else { newPixels[newIndex] = pixels[oldIndex]; } } } // Create a new texture sprite.temporaryTexture = true; if (oldTex.name.EndsWith("zoomed")) { sprite.name = oldTex.name.Substring(0, oldTex.name.Length - "zoomed".Length); } else { sprite.name = oldTex.name; } sprite.tex = new Texture2D(newWidth, newHeight); sprite.tex.SetPixels32(newPixels); sprite.tex.Apply(); // Remember the padding offset sprite.SetPadding(xmin, ymin, oldWidth - newWidth - xmin, oldHeight - newHeight - ymin); } list.Add(sprite); } #endregion } return(list); }