Multi-Platform Package Manager for Stable Diffusion
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

91 lines
2.1 KiB

using System;
using System.Threading.Tasks;
using AsyncImageLoader;
using Avalonia.Media.Imaging;
using StabilityMatrix.Core.Models.FileInterfaces;
namespace StabilityMatrix.Avalonia.Models;
public record ImageSource : IDisposable
{
/// <summary>
/// Local file path
/// </summary>
public FilePath? LocalFile { get; init; }
/// <summary>
/// Remote URL
/// </summary>
public Uri? RemoteUrl { get; init; }
/// <summary>
/// Bitmap
/// </summary>
public Bitmap? Bitmap { get; set; }
public ImageSource(FilePath localFile)
{
LocalFile = localFile;
}
public ImageSource(Uri remoteUrl)
{
RemoteUrl = remoteUrl;
}
public ImageSource(Bitmap bitmap)
{
Bitmap = bitmap;
}
public Task<Bitmap?> BitmapAsync => GetBitmapAsync();
/// <summary>
/// Get the bitmap
/// </summary>
public async Task<Bitmap?> GetBitmapAsync()
{
if (Bitmap is not null) return Bitmap;
var loader = ImageLoader.AsyncImageLoader;
// Use local file path if available, otherwise remote URL
var path = LocalFile?.FullPath ?? RemoteUrl?.ToString();
if (path is null) return null;
// Load the image
Bitmap = await loader.ProvideImageAsync(path).ConfigureAwait(false);
return Bitmap;
}
/// <summary>
/// Clears the cached bitmap
/// </summary>
protected virtual void Dispose(bool disposing)
{
if (!disposing) return;
Bitmap?.Dispose();
}
/// <inheritdoc />
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <inheritdoc />
public override string ToString()
{
return LocalFile?.FullPath ?? RemoteUrl?.ToString() ?? "";
}
/// <summary>
/// Implicit conversion to string for async image loader.
/// Resolves with the local file path if available, otherwise the remote URL.
/// Otherwise returns null.
/// </summary>
public static implicit operator string(ImageSource imageSource) => imageSource.ToString();
}