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