AngleSharp by Florian Rappl

<PackageReference Include="AngleSharp" Version="0.8.1" />

.NET API 1,172,480 bytes

 HtmlImageElement

Represents the image element.
using AngleSharp.Dom.Css; using AngleSharp.Extensions; using AngleSharp.Html; using AngleSharp.Services.Media; using System; using System.Threading; using System.Threading.Tasks; namespace AngleSharp.Dom.Html { internal sealed class HtmlImageElement : HtmlElement, IHtmlImageElement, IHtmlElement, IElement, INode, IEventTarget, IParentNode, IChildNode, INonDocumentTypeChildNode, IElementCssInlineStyle, IDisposable { private CancellationTokenSource _cts; private Task<IImageInfo> _imageTask; public string ActualSource => Source; public string SourceSet { get { return GetAttribute(AttributeNames.SrcSet); } set { SetAttribute(AttributeNames.SrcSet, value); } } public string Sizes { get { return GetAttribute(AttributeNames.Sizes); } set { SetAttribute(AttributeNames.Sizes, value); } } public string Source { get { return GetAttribute(AttributeNames.Src); } set { SetAttribute(AttributeNames.Src, value); } } public string AlternativeText { get { return GetAttribute(AttributeNames.Alt); } set { SetAttribute(AttributeNames.Alt, value); } } public string CrossOrigin { get { return GetAttribute(AttributeNames.CrossOrigin); } set { SetAttribute(AttributeNames.CrossOrigin, value); } } public string UseMap { get { return GetAttribute(AttributeNames.UseMap); } set { SetAttribute(AttributeNames.UseMap, value); } } public int DisplayWidth { get { return GetAttribute(AttributeNames.Width).ToInteger(OriginalWidth); } set { SetAttribute(AttributeNames.Width, value.ToString()); } } public int DisplayHeight { get { return GetAttribute(AttributeNames.Height).ToInteger(OriginalHeight); } set { SetAttribute(AttributeNames.Height, value.ToString()); } } public int OriginalWidth { get { if (_imageTask == null) return 0; if (!_imageTask.IsCompleted || _imageTask.Result == null) return 0; return _imageTask.Result.Width; } } public int OriginalHeight { get { if (_imageTask == null) return 0; if (!_imageTask.IsCompleted || _imageTask.Result == null) return 0; return _imageTask.Result.Height; } } public bool IsCompleted { get { if (_imageTask != null) return _imageTask.IsCompleted; return true; } } public bool IsMap { get { return GetAttribute(AttributeNames.IsMap) != null; } set { SetAttribute(AttributeNames.IsMap, value ? string.Empty : null); } } public HtmlImageElement(Document owner) : base(owner, Tags.Img, NodeFlags.SelfClosing | NodeFlags.Special) { RegisterAttributeObserver(AttributeNames.Src, UpdateSource); } public void Dispose() { if (_cts != null) _cts.Cancel(); _cts = null; _imageTask = null; } private void UpdateSource(string value) { if (_cts != null) _cts.Cancel(); if (!string.IsNullOrEmpty(value)) { Url image = this.HyperReference(value); _cts = new CancellationTokenSource(); _imageTask = LoadAsync(image, _cts.Token); } } private async Task<IImageInfo> LoadAsync(Url image, CancellationToken cancel) { IImageInfo result = await Owner.Options.LoadResource<IImageInfo>(image, cancel).ConfigureAwait(false); this.FireSimpleEvent(EventNames.Load, false, false); return result; } } }