private Texture2D IndexedToTexture(SpriteFrameData frame) { var image = new Texture2D(frame.Width, frame.Height, TextureFormat.ARGB32, false); image.wrapMode = TextureWrapMode.Clamp; image.alphaIsTransparency = true; var colors = new Color[frame.Width * frame.Height]; for (var y = 0; y < frame.Height; y++) { for (var x = 0; x < frame.Width; x++) { var index1 = frame.Data[x + y * frame.Width] * 4; var r = paletteData[index1 + 0]; var g = paletteData[index1 + 1]; var b = paletteData[index1 + 2]; var a = index1 > 0 ? 255 : 0; var color = new Color(r / 255f, g / 255f, b / 255f, a / 255f); colors[x + (frame.Height - y - 1) * frame.Width] = color; //image.SetPixel(x, frame.Height - y - 1, color); } } ExtendSpriteTextureData(colors, frame); image.SetPixels(colors); return(image); }
private Texture2D RgbaToTexture(SpriteFrameData frame) { var image = new Texture2D(frame.Width, frame.Height, TextureFormat.ARGB32, false); image.wrapMode = TextureWrapMode.Clamp; image.alphaIsTransparency = true; var colors = new Color[frame.Width * frame.Height]; //Debug.Log(frame.Width + " " + frame.Height); for (var y = 0; y < frame.Height; y++) { for (var x = 0; x < frame.Width; x++) { var pos = (x + (frame.Height - y - 1) * frame.Width) * 4; var r = frame.Data[pos + 3]; var g = frame.Data[pos + 2]; var b = frame.Data[pos + 1]; var a = frame.Data[pos + 0]; var color = new Color(r / 255f, g / 255f, b / 255f, a / 255f); colors[x + (frame.Height - y - 1) * frame.Width] = color; } } ExtendSpriteTextureData(colors, frame); image.SetPixels(colors); return(image); }
private void ExtendSpriteTextureData(Color[] colors, SpriteFrameData frame) { //we're going to extend the sprite color into the transparent area around the sprite //this is to make bilinear filtering work good with the sprite for (var y = 0; y < frame.Height; y++) { for (var x = 0; x < frame.Width; x++) { var count = 0; var r = 0f; var g = 0f; var b = 0f; var color = colors[x + y * frame.Width]; if (!Mathf.Approximately(color.a, 0)) { continue; } for (var y2 = -1; y2 <= 1; y2++) { for (var x2 = -1; x2 <= 1; x2++) { if (y + y2 < 0 || y + y2 >= frame.Height) { continue; } if (x + x2 < 0 || x + x2 >= frame.Width) { continue; } var color2 = colors[x + x2 + (y + y2) * frame.Width]; if (Mathf.Approximately(color2.a, 0)) { continue; } count++; r += color2.r; g += color2.g; b += color2.b; } } if (count > 0) { colors[x + y * frame.Width] = new Color(r / count, g / count, b / count, 0); } } } }
private void ReadRgbaImage() { for (var i = 0; i < rgbaCount; i++) { var width = br.ReadInt16(); var height = br.ReadInt16(); var frame = new SpriteFrameData() { IsIndexed = false, Width = width, Height = height, Data = br.ReadBytes(width * height * 4) }; spriteFrames.Add(frame); } }
private void ReadRleIndexedImage() { for (var i = 0; i < indexCount; i++) { var width = br.ReadUInt16(); var height = br.ReadUInt16(); var size = width * height; var data = new byte[size]; var index = 0; var end = br.ReadUInt16() + fs.Position; while (fs.Position < end) { var c = br.ReadByte(); data[index++] = c; if (c == 0) { var count = br.ReadByte(); if (count == 0) { data[index++] = count; } else { for (var j = 1; j < count; j++) { data[index++] = c; } } } } var frame = new SpriteFrameData() { IsIndexed = true, Width = width, Height = height, Data = data }; spriteFrames.Add(frame); } }
private void ReadIndexedImage() { for (var i = 0; i < indexCount; i++) { var width = br.ReadUInt16(); var height = br.ReadUInt16(); var data = br.ReadBytes(width * height); var frame = new SpriteFrameData() { IsIndexed = true, Width = width, Height = height, Data = data }; spriteFrames.Add(frame); } }