/// <summary> /// Converts an Enumerable of colors into a byte[]. /// Palette will be written before the image data /// </summary> /// <param name="colors"></param> /// <returns></returns> public byte[] Save(IEnumerable <Color> colors) { var redColors = CreatePalette(colors.ToList()); paletteBytes = (paletteFormat == null) ? null : paletteFormat.Save(redColors); var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms, true, byteOrder)) { foreach (var color in colors) { switch (BitDepth) { case 4: bw.WriteNibble(redColors.FindIndex(c => c == color)); break; case 8: bw.Write((byte)redColors.FindIndex(c => c == color)); break; default: throw new Exception($"BitDepth {BitDepth} not supported!"); } } } return(ms.ToArray()); }
public static byte[] Save(Bitmap bmp, ImageSettings settings, List <Color> pal) { settings.Width = bmp.Width; settings.Height = bmp.Height; var points = GetPointSequence(settings); var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms)) { foreach (var point in points) { var color = bmp.GetPixel(point.X, point.Y); switch (settings.BitPerIndex) { case BitLength.Bit4: bw.WriteNibble(pal.FindIndex(c => c == color)); break; case BitLength.Bit8: bw.Write((byte)pal.FindIndex(c => c == color)); break; default: throw new NotSupportedException(); } } } return(ms.ToArray()); }
public byte[] SaveIndices(IEnumerable <IndexData> indeces) { var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms, true, ByteOrder)) { foreach (var indexData in indeces) { switch (IndexDepth) { case 4: bw.WriteNibble(indexData.Index); break; case 8: bw.Write((byte)indexData.Index); break; default: throw new Exception($"IndexDepth {IndexDepth} not supported!"); } } } return(ms.ToArray()); }
public (byte[] indexData, byte[] paletteData) Save(IEnumerable <IndexData> indeces, IList <Color> palette) { var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms, true, _byteOrder)) { foreach (var indexData in indeces) { switch (_indexDepth) { case 4: bw.WriteNibble(indexData.Index); break; case 8: bw.Write((byte)indexData.Index); break; default: throw new Exception($"IndexDepth {_indexDepth} not supported!"); } } } return(ms.ToArray(), _paletteFormat.Save(palette)); }
public void SwitchNibbleBitWriting() { var expect = new byte[] { 0x04, 0x00, 0xF8, 0x48 }; var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms, ByteOrder.LittleEndian, BitOrder.MSBFirst, 2)) { bw.WriteNibble(0x4); bw.WriteBits(0x1F, 5); bw.WriteNibble(0x08); bw.WriteNibble(0x04); Assert.IsTrue(ms.ToArray().SequenceEqual(expect)); } }
public void NibbleWriting() { var expect = new byte[] { 0x84, 0x08 }; var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms)) { bw.WriteNibble(0x04); bw.WriteNibble(0x08); bw.WriteNibble(0x08); bw.Flush(); Assert.IsTrue(ms.ToArray().SequenceEqual(expect)); } }
public byte[] Save(IEnumerable <Color> colors) { var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms, true, byteOrder)) foreach (var color in colors) { var a = (aDepth == 0) ? 0 : Support.Support.ChangeBitDepth(color.A, 8, aDepth); var l = (lDepth == 0) ? 0 : Support.Support.ChangeBitDepth(color.G, 8, lDepth); var lShift = aDepth; long value = a; value |= (uint)(l << lShift); switch (BitDepth) { case 4: bw.WriteNibble((int)value); break; case 8: bw.Write((byte)value); break; case 16: bw.Write((ushort)value); break; default: throw new Exception($"BitDepth {BitDepth} not supported!"); } } return(ms.ToArray()); }
public byte[] Save(IEnumerable <Color> colors) { var ms = new MemoryStream(); using (var bw = new BinaryWriterX(ms, true, byteOrder)) foreach (var color in colors) { var r = (rDepth == 0) ? 0 : Helper.ChangeBitDepth(color.R, 8, rDepth); var g = (gDepth == 0) ? 0 : Helper.ChangeBitDepth(color.G, 8, gDepth); var rShift = gDepth; long value = g; value |= (uint)(r << rShift); switch (BitDepth) { case 4: bw.WriteNibble((int)value); break; case 8: bw.Write((byte)value); break; case 16: bw.Write((ushort)value); break; default: throw new Exception($"BitDepth {BitDepth} not supported!"); } } return(ms.ToArray()); }
public static byte[] Save(Bitmap bmp, ImageSettings settings) { settings.Width = bmp.Width; settings.Height = bmp.Height; var points = GetPointSequence(settings); var ms = new MemoryStream(); var etc1encoder = new ETC1.Encoder(); Enum.TryParse <DXT.Formats>(settings.Format.ToString(), false, out var dxtFormat); var dxtencoder = new DXT.Encoder(dxtFormat); using (var bw = new BinaryWriterX(ms)) { foreach (var point in points) { int x = Clamp(point.X, 0, bmp.Width); int y = Clamp(point.Y, 0, bmp.Height); var color = bmp.GetPixel(x, y); if (settings.PixelShader != null) { color = settings.PixelShader(color); } switch (settings.Format) { case Format.L8: bw.Write(color.G); break; case Format.A8: bw.Write(color.A); break; case Format.LA44: bw.WriteNibble(color.A / 16); bw.WriteNibble(color.G / 16); break; case Format.LA88: bw.Write(color.A); bw.Write(color.G); break; case Format.HL88: bw.Write(color.G); bw.Write(color.R); break; case Format.RGB565: bw.Write((short)((color.R / 8 << 11) | (color.G / 4 << 5) | (color.B / 8))); break; case Format.RGB888: bw.Write(color.B); bw.Write(color.G); bw.Write(color.R); break; case Format.RGBA5551: bw.Write((short)((color.R / 8 << 11) | (color.G / 8 << 6) | (color.B / 8 << 1) | color.A / 128)); break; case Format.RGBA4444: bw.WriteNibble(color.A / 16); bw.WriteNibble(color.B / 16); bw.WriteNibble(color.G / 16); bw.WriteNibble(color.R / 16); break; case Format.RGBA8888: bw.Write(color.A); bw.Write(color.B); bw.Write(color.G); bw.Write(color.R); break; case Format.ETC1: case Format.ETC1A4: etc1encoder.Set(color, data => { if (settings.Format == Format.ETC1A4) { bw.Write(data.Alpha); } bw.WriteStruct(data.Block); }); break; case Format.DXT1: case Format.DXT5: dxtencoder.Set(color, data => { if (settings.Format == Format.DXT5) { bw.Write(data.alpha); } bw.Write(data.block); }); break; case Format.L4: bw.WriteNibble(color.G / 16); break; case Format.A4: bw.WriteNibble(color.A / 16); break; default: throw new NotSupportedException(); } } } return(ms.ToArray()); }
public static byte[] Save(Bitmap bmp, ImageSettings settings) { settings.Width = bmp.Width; settings.Height = bmp.Height; var points = GetPointSequence(settings); var ms = new MemoryStream(); var etc1encoder = new ETC1.Encoder(); using (var bw = new BinaryWriterX(ms)) { foreach (var point in points) { int x = Clamp(point.X, 0, bmp.Width); int y = Clamp(point.Y, 0, bmp.Height); var color = bmp.GetPixel(x, y); //if (color.A == 0) color = default(Color); // daigasso seems to need this switch (settings.Format) { case Format.L8: bw.Write(color.G); break; case Format.A8: bw.Write(color.A); break; case Format.LA44: bw.WriteNibble(color.A / 16); bw.WriteNibble(color.G / 16); break; case Format.LA88: bw.Write(color.A); bw.Write(color.G); break; case Format.HL88: bw.Write(color.G); bw.Write(color.R); break; case Format.RGB565: bw.Write((short)((color.R / 8 << 11) | (color.G / 4 << 5) | (color.B / 8))); break; case Format.RGB888: bw.Write(color.B); bw.Write(color.G); bw.Write(color.R); break; case Format.RGBA5551: bw.Write((short)((color.R / 8 << 11) | (color.G / 8 << 6) | (color.B / 8 << 1) | color.A / 128)); break; case Format.RGBA4444: bw.WriteNibble(color.A / 16); bw.WriteNibble(color.B / 16); bw.WriteNibble(color.G / 16); bw.WriteNibble(color.R / 16); break; case Format.RGBA8888: bw.Write(color.A); bw.Write(color.B); bw.Write(color.G); bw.Write(color.R); break; case Format.ETC1: case Format.ETC1A4: etc1encoder.Set(color, data => { if (settings.Format == Format.ETC1A4) { bw.Write(data.Alpha); } bw.WriteStruct(data.Block); }); break; case Format.L4: bw.WriteNibble(color.G / 16); break; case Format.A4: bw.WriteNibble(color.A / 16); break; default: throw new NotSupportedException(); } } } return(ms.ToArray()); }