コード例 #1
0
        /// <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());
        }
コード例 #2
0
        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());
        }
コード例 #3
0
        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());
        }
コード例 #4
0
ファイル: Index2.cs プロジェクト: ultramario1998/Kuriimu2
        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));
        }
コード例 #5
0
        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));
            }
        }
コード例 #6
0
        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));
            }
        }
コード例 #7
0
        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());
        }
コード例 #8
0
ファイル: HL.cs プロジェクト: ultramario1998/Kuriimu2
        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());
        }
コード例 #9
0
ファイル: Common.cs プロジェクト: shenhaiyu/Kuriimu
        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());
        }
コード例 #10
0
ファイル: Common.cs プロジェクト: DarkSynopsis/Kuriimu
        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());
        }