public override void Open() { Close(); Header = TexHeader.Read(IOStream); Palettes = Header.TryReadPalette(IOStream); }
private static void FillIndexedProperties(TexHeader header, GLTexture palettes) { using (GLService.AcquireContext()) { int frameBuffer = GL.Ext.GenFramebuffer(); GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, frameBuffer); GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, palettes.Id, 0); byte[] pixels = new byte[4]; GL.ReadPixels(0, 0, 1, 1, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, pixels); GL.Ext.DeleteFramebuffer(frameBuffer); if (pixels[3] == 0) { header.ColorKeyFlag = 1; } } header.BytesPerPixel = 1; header.BitDepth = 8; header.BitsPerIndex = 8; header.BitsPerPixel = 8; header.PaletteFlag = 1; header.NumberOfPalettes = palettes.Height; header.NumberOfColorsPerPalette1 = palettes.Width; header.NumberOfColorsPerPalette2 = palettes.Width; header.PaletteSize = palettes.Width * palettes.Height; header.Unknown7 = 288; header.Unknown8 = 224; }
public void Convert() { using (Stream input = new FileStream(_inputFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { TexHeader header = TexHeader.Read(input); BitmapPalette[] palettes = header.TryReadPalette(input); if (palettes.Length == 0) { using (Stream output = new FileStream(_outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) Convert(input, output, header); } else { using (Stream output = new FileStream(_outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) Convert(input, output, header, palettes[0]); for (int i = 0; i < palettes.Length; i++) { string fileName = Path.ChangeExtension(_outputFile, string.Empty) + "_" + i.ToString("D" + palettes.Length / 10 + 1) + ".act"; using (Stream output = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)) SavePalette(palettes[i], output); } } } }
public static TexHeader Create(GLTexture texture, GLTexture palettes, bool b) { TexHeader result = new TexHeader { Version = TexVersion.FF8, ImageWidth = texture.Width, ImageHeight = texture.Height, ColorKeyArrayFlag = 0, MinAlphaBit = 4, MaxAlphaBit = 8, MinBitsPerColor = 4, MaxBitsPerColor = 8, MinBitsPerPixel = 8, MaxBitsPerPixel = 32, ReferenceAlpha = 255 }; if (texture.PixelFormat.GLPixelInternalFormat == PixelInternalFormat.R8) { if (palettes == null) { throw new ArgumentNullException("palettes"); } FillIndexedProperties(result, palettes); } else { throw new NotSupportedException(String.Format("Неподдерживаемый формат изображения: {0}.", texture.PixelFormat.GLPixelInternalFormat)); } return(result); }
private TexHeader CreateHeader(GLTexture texture, GLTexture palettes, bool hasKeyColor) { TexHeader header = new TexHeader { Version = TexVersion.FF8, ImageWidth = texture.Width, ImageHeight = texture.Height, ColorKeyArrayFlag = 0, MinAlphaBit = 4, MaxAlphaBit = 8, MinBitsPerColor = 4, MaxBitsPerColor = 8, MinBitsPerPixel = 8, MaxBitsPerPixel = 32, ReferenceAlpha = 255, // Палитра ColorKeyFlag = hasKeyColor ? 1 : 0, BytesPerPixel = 1, BitDepth = 8, BitsPerIndex = 8, BitsPerPixel = 8, PaletteFlag = 1, NumberOfPalettes = palettes.Height, NumberOfColorsPerPalette1 = palettes.Width, NumberOfColorsPerPalette2 = palettes.Width, PaletteSize = palettes.Width * palettes.Height, Unknown7 = 288, Unknown8 = 224 }; return(header); }
public static TexHeader Read(Stream input) { TexHeader result = input.ReadStruct <TexHeader>(); result.Validate(); return(result); }
private void WriteIndexedImage(GLTexture texture, GLTexture palette) { byte[] palettesPixels = palette.GetManagedPixelsArray(PixelFormat.Format32bppArgb); TexHeader header = CreateHeader(texture, palette, palettesPixels[3] == 0); _output.WriteStruct(header); _output.Write(palettesPixels, 0, palettesPixels.Length); using (SafeHGlobalHandle pixels = texture.GetUnmanagedPixelsArray(PixelFormat.Format8bppIndexed)) using (UnmanagedMemoryStream input = pixels.OpenStream(FileAccess.Read)) input.CopyTo(_output); }
private void Convert(Stream input, Stream output, TexHeader header, BitmapPalette palette) { using (GLTexture layer = header.TryReadData(input)) { throw new NotImplementedException(); //BitmapSource source = BitmapSource.Create(header.ImageWidth, header.ImageHeight, 96, 96, PixelFormats.Indexed8, palette, data.DangerousGetHandle(), (int)data.ByteLength, header.ImageWidth); //PngBitmapEncoder encoder = new PngBitmapEncoder { Interlace = PngInterlaceOption.Off }; //encoder.Frames.Add(BitmapFrame.Create(source)); //encoder.Save(output); } }
private void Convert(Stream input, Stream output, TexHeader header) { using (GLTexture layer = header.TryReadData(input)) { throw new NotImplementedException(); //TexPixelFormatsConverter converter = new TexPixelFormatsConverter(header, data, PixelFormats.Bgra32); //using (SafeHGlobalHandle result = converter.Convert()) //{ // data.Dispose(); // BitmapSource source = BitmapSource.Create(header.ImageWidth, header.ImageHeight, 96, 96, PixelFormats.Bgra32, null, result.DangerousGetHandle(), (int)result.ByteLength, header.ImageWidth * 4); // PngBitmapEncoder encoder = new PngBitmapEncoder { Interlace = PngInterlaceOption.Off }; // encoder.Frames.Add(BitmapFrame.Create(source)); // encoder.Save(output); //} } }
public TexPixelFormatsConverter(TexHeader header, SafeHGlobalHandle data, PixelFormat format) { if (header == null) { throw new ArgumentException("header"); } if (data == null || data.IsInvalid) { throw new ArgumentException("data"); } if (format != PixelFormats.Bgra32) { throw new ArgumentOutOfRangeException("format"); } _header = header; _source = data; _format = format; _buff = new byte[header.BytesPerPixel]; }
public static TexHeader Create(BitmapFrame frame, BitmapPalette[] palettes) { TexHeader result = new TexHeader { Version = TexVersion.FF8, ImageWidth = frame.PixelWidth, ImageHeight = frame.PixelHeight, ColorKeyArrayFlag = 0, MinAlphaBit = 4, MaxAlphaBit = 8, MinBitsPerColor = 4, MaxBitsPerColor = 8, MinBitsPerPixel = 8, MaxBitsPerPixel = 32, ReferenceAlpha = 255 }; if (frame.Format == PixelFormats.Indexed8) { if (palettes == null || palettes.Length == 0) { throw new ArgumentNullException("palettes"); } FillIndexedProperties(result, palettes); } else if (frame.Format == PixelFormats.Bgra32) { FillBgraProperties(result); } else { throw new NotSupportedException(String.Format("Неподдерживаемый формат изображения: {0}, поддерживаются только {1} и {2}.", frame.Format, PixelFormats.Bgra32, PixelFormats.Indexed8)); } return(result); }
public void Convert() { BitmapPalette[] palettes = TryFindPalettes(_inputFile); using (Stream input = new FileStream(_inputFile, FileMode.Open, FileAccess.Read, FileShare.Read)) using (Stream output = new FileStream(_outputFile, FileMode.Open, FileAccess.Write, FileShare.None)) { PngBitmapDecoder decoder = new PngBitmapDecoder(input, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); BitmapFrame frame = decoder.Frames[0]; TexHeader header = TexHeader.Create(frame, palettes); output.WriteStruct(header); if (palettes != null) { WriteIndexedImage(output, frame, palettes); } else { WriteBgraImage(output, frame); } } }
private static void FillIndexedProperties(TexHeader header, BitmapPalette[] palettes) { BitmapPalette palette = palettes[0]; Color color = palette.Colors[0]; if (color.A == 0) { header.ColorKeyFlag = 1; } header.BytesPerPixel = 1; header.BitDepth = 8; header.BitsPerIndex = 8; header.BitsPerPixel = 8; header.PaletteFlag = 1; header.NumberOfPalettes = palettes.Length; header.NumberOfColorsPerPalette1 = palette.Colors.Count; header.NumberOfColorsPerPalette2 = palette.Colors.Count; header.PaletteSize = palettes.Length * palette.Colors.Count; header.Unknown7 = 288; header.Unknown8 = 224; }
public override void Close() { IOStream.Seek(0, SeekOrigin.Begin); Header = null; Palettes = null; }
private static void FillBgraProperties(TexHeader header) { throw new NotImplementedException(); }
public TexTexture2DReader(TexHeader header, Stream input) { _header = Exceptions.CheckArgumentNull(header, "header"); _input = Exceptions.CheckReadableStream(input, "input"); }