Files
mixtape/zero/Media/MediaExtensions.cs
T

72 lines
2.0 KiB
C#

using SixLabors.ImageSharp.Metadata.Profiles.Exif;
using SixLabors.ImageSharp.Web;
using System.Numerics;
namespace zero.Media;
public static class MediaExtensions
{
public static SixLabors.ImageSharp.PointF GetFocalPointF(this MediaFocalPoint focalPoint)
{
if (focalPoint == null)
{
focalPoint = new() { Left = 0.5m, Top = 0.5m };
}
Vector2 center = new((float)focalPoint.Left, (float)focalPoint.Top);
return ExifOrientationUtilities.Transform(center, Vector2.Zero, Vector2.One, ExifOrientationMode.Unknown);
}
public static string CssObjectPosition(this MediaFocalPoint focalPoint)
{
string values = String.Empty;
if (focalPoint != null && (focalPoint.Left != 0.5m || focalPoint.Top != 0.5m))
{
Func<decimal, string> round = input => Decimal.Round(input, 0, MidpointRounding.ToEven).ToString();
values = String.Format("{0}% {1}%", round(focalPoint.Left * 100), round(focalPoint.Top * 100));
}
return values;
}
public static string Resize(this string path, string preset) => path.Resize(preset, null);
public static string Resize(this string path, string preset, MediaFocalPoint focalPoint = null)
{
if (path.IsNullOrEmpty())
{
return String.Empty;
}
List<string> parts = path.Split('/').ToList();
parts.Insert(parts.Count - 1, ":" + preset + StringifyFocalPoint(focalPoint));
if (parts[0] == "http:" || parts[0] == "https:")
{
return String.Join('/', parts);
}
return String.Join('/', parts).EnsureStartsWith('/');
}
static string StringifyFocalPoint(MediaFocalPoint focalPoint = null)
{
string xy = String.Empty;
if (focalPoint != null && (focalPoint.Left != 0.5m || focalPoint.Top != 0.5m))
{
Func<decimal, string> round = input =>
{
return Decimal.Round(input, 2, MidpointRounding.ToEven).ToString().Replace(',', '.');
};
xy = String.Format(":{0},{1}", round(focalPoint.Left), round(focalPoint.Top));
}
return xy;
}
}