Ionite
10 months ago
committed by
GitHub
5 changed files with 150 additions and 8 deletions
@ -0,0 +1,57 @@
|
||||
using System.Text; |
||||
|
||||
namespace StabilityMatrix.Core.Helper.Webp; |
||||
|
||||
public class WebpReader(Stream stream) : BinaryReader(stream, Encoding.ASCII, true) |
||||
{ |
||||
private uint headerFileSize; |
||||
|
||||
public bool GetIsAnimatedFlag() |
||||
{ |
||||
ReadHeader(); |
||||
|
||||
while (BaseStream.Position < headerFileSize) |
||||
{ |
||||
if (ReadVoidChunk() is "ANMF" or "ANIM") |
||||
{ |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
return false; |
||||
} |
||||
|
||||
private void ReadHeader() |
||||
{ |
||||
// RIFF |
||||
var riff = ReadBytes(4); |
||||
if (!riff.SequenceEqual([.."RIFF"u8])) |
||||
{ |
||||
throw new InvalidDataException("Invalid RIFF header"); |
||||
} |
||||
|
||||
// Size: uint32 |
||||
headerFileSize = ReadUInt32(); |
||||
|
||||
// WEBP |
||||
var webp = ReadBytes(4); |
||||
if (!webp.SequenceEqual([.."WEBP"u8])) |
||||
{ |
||||
throw new InvalidDataException("Invalid WEBP header"); |
||||
} |
||||
} |
||||
|
||||
// Read a single chunk and discard its contents |
||||
private string ReadVoidChunk() |
||||
{ |
||||
// FourCC: 4 bytes in ASCII |
||||
var result = ReadBytes(4); |
||||
|
||||
// Size: uint32 |
||||
var size = ReadUInt32(); |
||||
|
||||
BaseStream.Seek(size, SeekOrigin.Current); |
||||
|
||||
return Encoding.ASCII.GetString(result); |
||||
} |
||||
} |
Loading…
Reference in new issue