Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
        }