private static fdAT Read_fdAT(string png, int i) { BinaryReader br = new BinaryReader(new FileStream(png, FileMode.Open)); fdAT fdat = new fdAT(); fdat.id = Encoding.ASCII.GetBytes(new char[] { 'f', 'd', 'A', 'T' }); fdat.sequence_number = BitConverter.GetBytes(i).Reverse().ToArray(); bool encontrado = false; string c = "\0\0\0\0"; while (!encontrado) { c = c.Remove(0, 1); c += (char)br.ReadByte(); if (c == "IDAT") { encontrado = true; } } br.BaseStream.Position -= 8; int length = BitConverter.ToInt32(br.ReadBytes(4).Reverse().ToArray(), 0); fdat.length = BitConverter.GetBytes(length + 4).Reverse().ToArray(); br.BaseStream.Position += 4; fdat.data = br.ReadBytes(length); List <Byte> stream = new List <byte>(); stream.AddRange(fdat.id); stream.AddRange(fdat.sequence_number); stream.AddRange(fdat.data); fdat.crc = Helper.CRC32.Calculate(stream.ToArray()); br.Close(); return(fdat); }
private static void Write(string apng, byte[] signature, IHDR ihdr, acTL actl, byte[] idat, fcTL[] fctl, fdAT[] fdat, IEND iend) { BinaryWriter bw = new BinaryWriter(new FileStream(apng, FileMode.Create)); bw.Write(signature); bw.Write(ihdr.length); bw.Write(ihdr.id); bw.Write(ihdr.width); bw.Write(ihdr.height); bw.Write(ihdr.depth); bw.Write(ihdr.colour_type); bw.Write(ihdr.compression); bw.Write(ihdr.filter); bw.Write(ihdr.interlace); bw.Write(ihdr.crc); bw.Write(actl.length); bw.Write(actl.id); bw.Write(actl.num_frames); bw.Write(actl.num_plays); bw.Write(actl.crc); bw.Write(fctl[0].length); bw.Write(fctl[0].id); bw.Write(fctl[0].sequence_numer); bw.Write(fctl[0].width); bw.Write(fctl[0].height); bw.Write(fctl[0].x_offset); bw.Write(fctl[0].y_offset); bw.Write(fctl[0].delay_num); bw.Write(fctl[0].delay_den); bw.Write(fctl[0].dispose_op); bw.Write(fctl[0].blend_op); bw.Write(fctl[0].crc); bw.Write(idat); for (int i = 0; i < fdat.Length; i++) { bw.Write(fctl[i + 1].length); bw.Write(fctl[i + 1].id); bw.Write(fctl[i + 1].sequence_numer); bw.Write(fctl[i + 1].width); bw.Write(fctl[i + 1].height); bw.Write(fctl[i + 1].x_offset); bw.Write(fctl[i + 1].y_offset); bw.Write(fctl[i + 1].delay_num); bw.Write(fctl[i + 1].delay_den); bw.Write(fctl[i + 1].dispose_op); bw.Write(fctl[i + 1].blend_op); bw.Write(fctl[i + 1].crc); bw.Write(fdat[i].length); bw.Write(fdat[i].id); bw.Write(fdat[i].sequence_number); bw.Write(fdat[i].data); bw.Write(fdat[i].crc); } bw.Write(iend.length); bw.Write(iend.id); bw.Write(iend.crc); bw.Flush(); bw.Close(); }
private static fdAT Read_fdAT(string png, int i) { BinaryReader br = new BinaryReader(new FileStream(png, FileMode.Open)); fdAT fdat = new fdAT(); fdat.id = Encoding.ASCII.GetBytes(new char[] { 'f', 'd', 'A', 'T' }); fdat.sequence_number = BitConverter.GetBytes(i).Reverse().ToArray(); bool encontrado = false; string c = "\0\0\0\0"; while (!encontrado) { c = c.Remove(0, 1); c += (char)br.ReadByte(); if (c == "IDAT") encontrado = true; } br.BaseStream.Position -= 8; int length = BitConverter.ToInt32(br.ReadBytes(4).Reverse().ToArray(), 0); fdat.length = BitConverter.GetBytes(length + 4).Reverse().ToArray(); br.BaseStream.Position += 4; fdat.data = br.ReadBytes(length); List<Byte> stream = new List<byte>(); stream.AddRange(fdat.id); stream.AddRange(fdat.sequence_number); stream.AddRange(fdat.data); fdat.crc = Helper.CRC32.Calculate(stream.ToArray()); br.Close(); return fdat; }