Updated imagesharp
This commit is contained in:
parent
55b1c3945b
commit
661d026973
@ -11,6 +11,7 @@ using System.Threading.Tasks;
|
|||||||
using NadekoBot.Common;
|
using NadekoBot.Common;
|
||||||
using NadekoBot.Common.Attributes;
|
using NadekoBot.Common.Attributes;
|
||||||
using Image = ImageSharp.Image;
|
using Image = ImageSharp.Image;
|
||||||
|
using ImageSharp;
|
||||||
|
|
||||||
namespace NadekoBot.Modules.Gambling
|
namespace NadekoBot.Modules.Gambling
|
||||||
{
|
{
|
||||||
@ -19,8 +20,8 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
[Group]
|
[Group]
|
||||||
public class DriceRollCommands : NadekoSubmodule
|
public class DriceRollCommands : NadekoSubmodule
|
||||||
{
|
{
|
||||||
private Regex dndRegex { get; } = new Regex(@"^(?<n1>\d+)d(?<n2>\d+)(?:\+(?<add>\d+))?(?:\-(?<sub>\d+))?$", RegexOptions.Compiled);
|
private readonly Regex dndRegex = new Regex(@"^(?<n1>\d+)d(?<n2>\d+)(?:\+(?<add>\d+))?(?:\-(?<sub>\d+))?$", RegexOptions.Compiled);
|
||||||
private Regex fudgeRegex { get; } = new Regex(@"^(?<n1>\d+)d(?:F|f)$", RegexOptions.Compiled);
|
private readonly Regex fudgeRegex = new Regex(@"^(?<n1>\d+)d(?:F|f)$", RegexOptions.Compiled);
|
||||||
|
|
||||||
private readonly char[] _fateRolls = { '-', ' ', '+' };
|
private readonly char[] _fateRolls = { '-', ' ', '+' };
|
||||||
private readonly IImagesService _images;
|
private readonly IImagesService _images;
|
||||||
@ -42,7 +43,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
var imageStream = await Task.Run(() =>
|
var imageStream = await Task.Run(() =>
|
||||||
{
|
{
|
||||||
var ms = new MemoryStream();
|
var ms = new MemoryStream();
|
||||||
new[] { GetDice(num1), GetDice(num2) }.Merge().Save(ms);
|
new[] { GetDice(num1), GetDice(num2) }.Merge().SaveAsPng(ms);
|
||||||
ms.Position = 0;
|
ms.Position = 0;
|
||||||
return ms;
|
return ms;
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
@ -97,7 +98,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
|
|
||||||
var rng = new NadekoRandom();
|
var rng = new NadekoRandom();
|
||||||
|
|
||||||
var dice = new List<Image>(num);
|
var dice = new List<Image<Rgba32>>(num);
|
||||||
var values = new List<int>(num);
|
var values = new List<int>(num);
|
||||||
for (var i = 0; i < num; i++)
|
for (var i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
@ -127,7 +128,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
|
|
||||||
var bitmap = dice.Merge();
|
var bitmap = dice.Merge();
|
||||||
var ms = new MemoryStream();
|
var ms = new MemoryStream();
|
||||||
bitmap.Save(ms);
|
bitmap.SaveAsPng(ms);
|
||||||
ms.Position = 0;
|
ms.Position = 0;
|
||||||
await Context.Channel.SendFileAsync(ms, "dice.png",
|
await Context.Channel.SendFileAsync(ms, "dice.png",
|
||||||
Context.User.Mention + " " +
|
Context.User.Mention + " " +
|
||||||
@ -213,7 +214,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
await ReplyConfirmLocalized("dice_rolled", Format.Bold(rolled.ToString())).ConfigureAwait(false);
|
await ReplyConfirmLocalized("dice_rolled", Format.Bold(rolled.ToString())).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Image GetDice(int num)
|
private Image<Rgba32> GetDice(int num)
|
||||||
{
|
{
|
||||||
if (num < 0 || num > 10)
|
if (num < 0 || num > 10)
|
||||||
throw new ArgumentOutOfRangeException(nameof(num));
|
throw new ArgumentOutOfRangeException(nameof(num));
|
||||||
@ -224,15 +225,15 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
using (var imgOneStream = images[1].ToStream())
|
using (var imgOneStream = images[1].ToStream())
|
||||||
using (var imgZeroStream = images[0].ToStream())
|
using (var imgZeroStream = images[0].ToStream())
|
||||||
{
|
{
|
||||||
Image imgOne = new Image(imgOneStream);
|
var imgOne = Image.Load(imgOneStream);
|
||||||
Image imgZero = new Image(imgZeroStream);
|
var imgZero = Image.Load(imgZeroStream);
|
||||||
|
|
||||||
return new[] { imgOne, imgZero }.Merge();
|
return new[] { imgOne, imgZero }.Merge();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
using (var die = _images.Dice[num].ToStream())
|
using (var die = _images.Dice[num].ToStream())
|
||||||
{
|
{
|
||||||
return new Image(die);
|
return Image.Load(die);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@ using System.Threading.Tasks;
|
|||||||
using NadekoBot.Common.Attributes;
|
using NadekoBot.Common.Attributes;
|
||||||
using NadekoBot.Modules.Gambling.Common;
|
using NadekoBot.Modules.Gambling.Common;
|
||||||
using Image = ImageSharp.Image;
|
using Image = ImageSharp.Image;
|
||||||
|
using ImageSharp;
|
||||||
|
|
||||||
namespace NadekoBot.Modules.Gambling
|
namespace NadekoBot.Modules.Gambling
|
||||||
{
|
{
|
||||||
@ -27,7 +28,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
throw new ArgumentOutOfRangeException(nameof(num));
|
throw new ArgumentOutOfRangeException(nameof(num));
|
||||||
|
|
||||||
Cards cards = guildId == null ? new Cards() : _allDecks.GetOrAdd(Context.Guild, (s) => new Cards());
|
Cards cards = guildId == null ? new Cards() : _allDecks.GetOrAdd(Context.Guild, (s) => new Cards());
|
||||||
var images = new List<Image>();
|
var images = new List<Image<Rgba32>>();
|
||||||
var cardObjects = new List<Cards.Card>();
|
var cardObjects = new List<Cards.Card>();
|
||||||
for (var i = 0; i < num; i++)
|
for (var i = 0; i < num; i++)
|
||||||
{
|
{
|
||||||
@ -46,10 +47,10 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
var currentCard = cards.DrawACard();
|
var currentCard = cards.DrawACard();
|
||||||
cardObjects.Add(currentCard);
|
cardObjects.Add(currentCard);
|
||||||
using (var stream = File.OpenRead(Path.Combine(_cardsPath, currentCard.ToString().ToLowerInvariant() + ".jpg").Replace(' ', '_')))
|
using (var stream = File.OpenRead(Path.Combine(_cardsPath, currentCard.ToString().ToLowerInvariant() + ".jpg").Replace(' ', '_')))
|
||||||
images.Add(new Image(stream));
|
images.Add(Image.Load(stream));
|
||||||
}
|
}
|
||||||
MemoryStream bitmapStream = new MemoryStream();
|
MemoryStream bitmapStream = new MemoryStream();
|
||||||
images.Merge().Save(bitmapStream);
|
images.Merge().SaveAsPng(bitmapStream);
|
||||||
bitmapStream.Position = 0;
|
bitmapStream.Position = 0;
|
||||||
|
|
||||||
var toSend = $"{Context.User.Mention}";
|
var toSend = $"{Context.User.Mention}";
|
||||||
|
@ -9,6 +9,7 @@ using System.Threading.Tasks;
|
|||||||
using NadekoBot.Common;
|
using NadekoBot.Common;
|
||||||
using NadekoBot.Common.Attributes;
|
using NadekoBot.Common.Attributes;
|
||||||
using Image = ImageSharp.Image;
|
using Image = ImageSharp.Image;
|
||||||
|
using ImageSharp;
|
||||||
|
|
||||||
namespace NadekoBot.Modules.Gambling
|
namespace NadekoBot.Modules.Gambling
|
||||||
{
|
{
|
||||||
@ -56,7 +57,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
await ReplyErrorLocalized("flip_invalid", 10).ConfigureAwait(false);
|
await ReplyErrorLocalized("flip_invalid", 10).ConfigureAwait(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var imgs = new Image[count];
|
var imgs = new Image<Rgba32>[count];
|
||||||
for (var i = 0; i < count; i++)
|
for (var i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
using (var heads = _images.Heads.ToStream())
|
using (var heads = _images.Heads.ToStream())
|
||||||
@ -64,11 +65,11 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
{
|
{
|
||||||
if (rng.Next(0, 10) < 5)
|
if (rng.Next(0, 10) < 5)
|
||||||
{
|
{
|
||||||
imgs[i] = new Image(heads);
|
imgs[i] = Image.Load(heads);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
imgs[i] = new Image(tails);
|
imgs[i] = Image.Load(tails);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using NadekoBot.Common;
|
using NadekoBot.Common;
|
||||||
using NadekoBot.Common.Attributes;
|
using NadekoBot.Common.Attributes;
|
||||||
|
using SixLabors.Primitives;
|
||||||
|
|
||||||
namespace NadekoBot.Modules.Gambling
|
namespace NadekoBot.Modules.Gambling
|
||||||
{
|
{
|
||||||
@ -166,7 +167,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
Interlocked.Add(ref _totalBet, amount);
|
Interlocked.Add(ref _totalBet, amount);
|
||||||
using (var bgFileStream = _images.SlotBackground.ToStream())
|
using (var bgFileStream = _images.SlotBackground.ToStream())
|
||||||
{
|
{
|
||||||
var bgImage = new ImageSharp.Image(bgFileStream);
|
var bgImage = ImageSharp.Image.Load(bgFileStream);
|
||||||
|
|
||||||
var result = SlotMachine.Pull();
|
var result = SlotMachine.Pull();
|
||||||
int[] numbers = result.Numbers;
|
int[] numbers = result.Numbers;
|
||||||
@ -174,7 +175,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
{
|
{
|
||||||
using (var file = _images.SlotEmojis[numbers[i]].ToStream())
|
using (var file = _images.SlotEmojis[numbers[i]].ToStream())
|
||||||
using (var randomImage = new ImageSharp.Image(file))
|
using (var randomImage = ImageSharp.Image.Load(file))
|
||||||
{
|
{
|
||||||
bgImage.DrawImage(randomImage, 100, default(Size), new Point(95 + 142 * i, 330));
|
bgImage.DrawImage(randomImage, 100, default(Size), new Point(95 + 142 * i, 330));
|
||||||
}
|
}
|
||||||
@ -187,7 +188,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
{
|
{
|
||||||
var digit = printWon % 10;
|
var digit = printWon % 10;
|
||||||
using (var fs = _images.SlotNumbers[digit].ToStream())
|
using (var fs = _images.SlotNumbers[digit].ToStream())
|
||||||
using (var img = new ImageSharp.Image(fs))
|
using (var img = ImageSharp.Image.Load(fs))
|
||||||
{
|
{
|
||||||
bgImage.DrawImage(img, 100, default(Size), new Point(230 - n * 16, 462));
|
bgImage.DrawImage(img, 100, default(Size), new Point(230 - n * 16, 462));
|
||||||
}
|
}
|
||||||
@ -200,7 +201,7 @@ namespace NadekoBot.Modules.Gambling
|
|||||||
{
|
{
|
||||||
var digit = printAmount % 10;
|
var digit = printAmount % 10;
|
||||||
using (var fs = _images.SlotNumbers[digit].ToStream())
|
using (var fs = _images.SlotNumbers[digit].ToStream())
|
||||||
using (var img = new ImageSharp.Image(fs))
|
using (var img = ImageSharp.Image.Load(fs))
|
||||||
{
|
{
|
||||||
bgImage.DrawImage(img, 100, default(Size), new Point(395 - n * 16, 462));
|
bgImage.DrawImage(img, 100, default(Size), new Point(395 - n * 16, 462));
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ using NadekoBot.Common;
|
|||||||
using NadekoBot.Extensions;
|
using NadekoBot.Extensions;
|
||||||
using NadekoBot.Services;
|
using NadekoBot.Services;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
using SixLabors.Primitives;
|
||||||
|
|
||||||
namespace NadekoBot.Modules.Games.Common
|
namespace NadekoBot.Modules.Games.Common
|
||||||
{
|
{
|
||||||
@ -32,7 +33,7 @@ namespace NadekoBot.Modules.Games.Common
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var ms = new MemoryStream(_images.WifeMatrix.ToArray(), false))
|
using (var ms = new MemoryStream(_images.WifeMatrix.ToArray(), false))
|
||||||
using (var img = new ImageSharp.Image(ms))
|
using (var img = Image.Load(ms))
|
||||||
{
|
{
|
||||||
const int minx = 35;
|
const int minx = 35;
|
||||||
const int miny = 385;
|
const int miny = 385;
|
||||||
@ -42,7 +43,7 @@ namespace NadekoBot.Modules.Games.Common
|
|||||||
var pointy = (int)(miny - length * ((Crazy - 4) / 6));
|
var pointy = (int)(miny - length * ((Crazy - 4) / 6));
|
||||||
|
|
||||||
using (var pointMs = new MemoryStream(_images.RategirlDot.ToArray(), false))
|
using (var pointMs = new MemoryStream(_images.RategirlDot.ToArray(), false))
|
||||||
using (var pointImg = new ImageSharp.Image(pointMs))
|
using (var pointImg = Image.Load(pointMs))
|
||||||
{
|
{
|
||||||
img.DrawImage(pointImg, 100, default(Size), new Point(pointx - 10, pointy - 10));
|
img.DrawImage(pointImg, 100, default(Size), new Point(pointx - 10, pointy - 10));
|
||||||
}
|
}
|
||||||
@ -51,7 +52,7 @@ namespace NadekoBot.Modules.Games.Common
|
|||||||
using (var http = new HttpClient())
|
using (var http = new HttpClient())
|
||||||
using (var imgStream = new MemoryStream())
|
using (var imgStream = new MemoryStream())
|
||||||
{
|
{
|
||||||
img.Save(imgStream);
|
img.SaveAsPng(imgStream);
|
||||||
var byteContent = new ByteArrayContent(imgStream.ToArray());
|
var byteContent = new ByteArrayContent(imgStream.ToArray());
|
||||||
http.AddFakeHeaders();
|
http.AddFakeHeaders();
|
||||||
|
|
||||||
|
@ -390,7 +390,7 @@ namespace NadekoBot.Modules.Searches
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
var items = JArray.Parse(response).Shuffle().ToList();
|
var items = JArray.Parse(response).Shuffle().ToList();
|
||||||
var images = new List<ImageSharp.Image>();
|
var images = new List<Image<Rgba32>>();
|
||||||
if (items == null)
|
if (items == null)
|
||||||
throw new KeyNotFoundException("Cannot find a card by that name");
|
throw new KeyNotFoundException("Cannot find a card by that name");
|
||||||
foreach (var item in items.Where(item => item.HasValues && item["img"] != null).Take(4))
|
foreach (var item in items.Where(item => item.HasValues && item["img"] != null).Take(4))
|
||||||
@ -402,7 +402,7 @@ namespace NadekoBot.Modules.Searches
|
|||||||
var imgStream = new MemoryStream();
|
var imgStream = new MemoryStream();
|
||||||
await sr.CopyToAsync(imgStream);
|
await sr.CopyToAsync(imgStream);
|
||||||
imgStream.Position = 0;
|
imgStream.Position = 0;
|
||||||
images.Add(new ImageSharp.Image(imgStream));
|
images.Add(ImageSharp.Image.Load(imgStream));
|
||||||
}
|
}
|
||||||
}).ConfigureAwait(false);
|
}).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@ -412,7 +412,7 @@ namespace NadekoBot.Modules.Searches
|
|||||||
msg = GetText("hs_over_x", 4);
|
msg = GetText("hs_over_x", 4);
|
||||||
}
|
}
|
||||||
var ms = new MemoryStream();
|
var ms = new MemoryStream();
|
||||||
await Task.Run(() => images.AsEnumerable().Merge().Save(ms));
|
await Task.Run(() => images.AsEnumerable().Merge().SaveAsPng(ms));
|
||||||
ms.Position = 0;
|
ms.Position = 0;
|
||||||
await Context.Channel.SendFileAsync(ms, arg + ".png", msg).ConfigureAwait(false);
|
await Context.Channel.SendFileAsync(ms, arg + ".png", msg).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
@ -634,10 +634,10 @@ namespace NadekoBot.Modules.Searches
|
|||||||
color = color?.Trim().Replace("#", "");
|
color = color?.Trim().Replace("#", "");
|
||||||
if (string.IsNullOrWhiteSpace(color))
|
if (string.IsNullOrWhiteSpace(color))
|
||||||
return;
|
return;
|
||||||
ImageSharp.Color clr;
|
Rgba32 clr;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
clr = ImageSharp.Color.FromHex(color);
|
clr = Rgba32.FromHex(color);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
@ -646,7 +646,7 @@ namespace NadekoBot.Modules.Searches
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var img = new ImageSharp.Image(50, 50);
|
var img = new ImageSharp.Image<Rgba32>(50, 50);
|
||||||
|
|
||||||
img.BackgroundColor(clr);
|
img.BackgroundColor(clr);
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ namespace NadekoBot.Modules.Utility
|
|||||||
|
|
||||||
var hexColors = hexes.Select(hex =>
|
var hexColors = hexes.Select(hex =>
|
||||||
{
|
{
|
||||||
try { return (ImageSharp.Color?)ImageSharp.Color.FromHex(hex.Replace("#", "")); } catch { return null; }
|
try { return (Rgba32?)Rgba32.FromHex(hex.Replace("#", "")); } catch { return null; }
|
||||||
})
|
})
|
||||||
.Where(c => c != null)
|
.Where(c => c != null)
|
||||||
.Select(c => c.Value)
|
.Select(c => c.Value)
|
||||||
@ -76,7 +76,7 @@ namespace NadekoBot.Modules.Utility
|
|||||||
|
|
||||||
var images = hexColors.Select(color =>
|
var images = hexColors.Select(color =>
|
||||||
{
|
{
|
||||||
var img = new ImageSharp.Image(50, 50);
|
var img = new ImageSharp.Image<Rgba32>(50, 50);
|
||||||
img.BackgroundColor(color);
|
img.BackgroundColor(color);
|
||||||
return img;
|
return img;
|
||||||
}).Merge().ToStream();
|
}).Merge().ToStream();
|
||||||
|
@ -64,8 +64,8 @@
|
|||||||
<PackageReference Include="Google.Apis.Urlshortener.v1" Version="1.19.0.138" />
|
<PackageReference Include="Google.Apis.Urlshortener.v1" Version="1.19.0.138" />
|
||||||
<PackageReference Include="Google.Apis.YouTube.v3" Version="1.20.0.701" />
|
<PackageReference Include="Google.Apis.YouTube.v3" Version="1.20.0.701" />
|
||||||
<PackageReference Include="Google.Apis.Customsearch.v1" Version="1.20.0.466" />
|
<PackageReference Include="Google.Apis.Customsearch.v1" Version="1.20.0.466" />
|
||||||
<PackageReference Include="ImageSharp" Version="1.0.0-alpha4-00031" />
|
<PackageReference Include="ImageSharp" Version="1.0.0-alpha9-00171" />
|
||||||
<PackageReference Include="ImageSharp.Drawing" Version="1.0.0-alpha4-00031" />
|
<PackageReference Include="ImageSharp.Drawing" Version="1.0.0-alpha9-00166" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="1.1.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="1.1.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.1" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.1" />
|
||||||
|
@ -15,6 +15,8 @@ using System.Text;
|
|||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using NadekoBot.Common.Collections;
|
using NadekoBot.Common.Collections;
|
||||||
|
using SixLabors.Primitives;
|
||||||
|
using ImageSharp.PixelFormats;
|
||||||
|
|
||||||
namespace NadekoBot.Extensions
|
namespace NadekoBot.Extensions
|
||||||
{
|
{
|
||||||
@ -131,10 +133,10 @@ namespace NadekoBot.Extensions
|
|||||||
public static string ToJson<T>(this T any, Formatting formatting = Formatting.Indented) =>
|
public static string ToJson<T>(this T any, Formatting formatting = Formatting.Indented) =>
|
||||||
JsonConvert.SerializeObject(any, formatting);
|
JsonConvert.SerializeObject(any, formatting);
|
||||||
|
|
||||||
public static Stream ToStream(this ImageSharp.Image img)
|
public static Stream ToStream(this ImageSharp.Image<Rgba32> img)
|
||||||
{
|
{
|
||||||
var imageStream = new MemoryStream();
|
var imageStream = new MemoryStream();
|
||||||
img.Save(imageStream);
|
img.SaveAsPng(imageStream);
|
||||||
imageStream.Position = 0;
|
imageStream.Position = 0;
|
||||||
return imageStream;
|
return imageStream;
|
||||||
}
|
}
|
||||||
@ -198,11 +200,11 @@ namespace NadekoBot.Extensions
|
|||||||
return await ownerPrivate.SendMessageAsync(message).ConfigureAwait(false);
|
return await ownerPrivate.SendMessageAsync(message).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ImageSharp.Image Merge(this IEnumerable<ImageSharp.Image> images)
|
public static Image<Rgba32> Merge(this IEnumerable<ImageSharp.Image<Rgba32>> images)
|
||||||
{
|
{
|
||||||
var imgs = images.ToArray();
|
var imgs = images.ToArray();
|
||||||
|
|
||||||
var canvas = new ImageSharp.Image(imgs.Sum(img => img.Width), imgs.Max(img => img.Height));
|
var canvas = new Image<Rgba32>(imgs.Sum(img => img.Width), imgs.Max(img => img.Height));
|
||||||
|
|
||||||
var xOffset = 0;
|
var xOffset = 0;
|
||||||
for (int i = 0; i < imgs.Length; i++)
|
for (int i = 0; i < imgs.Length; i++)
|
||||||
|
Loading…
Reference in New Issue
Block a user