public async Task <Image?> LoadThumbnailAsync(CancellationToken ct) { if (ImageSize == 0xffffffff) { return(null); } using var imageOwner = MemoryPool <byte> .Shared.Rent((int) ImageSize); var image = imageOwner.Memory.Slice(0, (int)ImageSize); Prefix.CopyTo(imageOwner.Memory.Slice(0, Prefix.Length)); if (BodySize > 0) { await using var bodyStream = new FileStream(BodyLocation, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.Asynchronous | FileOptions.SequentialScan); if (await bodyStream.ReadAsync(image.Slice(Prefix.Length, (int)BodySize), ct).ConfigureAwait(false) != BodySize) { throw new EndOfStreamException(); } } try { return(await Task.Run(() => { return OpenJpeg.Decode(image.Span, 64); }, ct).ConfigureAwait(false)); } catch (OpenJpegException) { return(null); } }
public async Task <ReadOnlyMemory <byte> > LoadAsync(CancellationToken ct) { var image = new Memory <byte>(new byte[(int)ImageSize]); Prefix.CopyTo(image.Slice(0, Prefix.Length)); if (BodySize > 0) { await using var bodyStream = new FileStream(BodyLocation, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.Asynchronous | FileOptions.SequentialScan); if (await bodyStream.ReadAsync(image.Slice(Prefix.Length, (int)BodySize), ct).ConfigureAwait(false) != BodySize) { throw new EndOfStreamException(); } } return(image); }