Skip to content

Instantly share code, notes, and snippets.

@safern
Created November 18, 2021 04:19
Show Gist options
  • Save safern/364bc27301575cc39daa9ea1bf4df285 to your computer and use it in GitHub Desktop.
Save safern/364bc27301575cc39daa9ea1bf4df285 to your computer and use it in GitHub Desktop.
RoundImageDrawing
// See https://aka.ms/new-console-template for more information
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
string imageBase64 = "iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAScSURBVGhD1Zp7qBVVFIdvZdlbK7ESisogzUiTBKm/CsRCMqMgkswHSmGBGoKSIj6QyvSPSHpgQglikYFGYhQFGYpEopgFPlJE1MjsaWkv7fvGWXQ4zpw7l+7xbH/wcc5es+fMntl7r73WntOWkLrkn2ecLoOLT37Nvm+Gb+BuDWeKHoffYT8Mhk/gRM7fMA3OgqQ1C6LRcjz/PAAL4K+8/A5cAElqEthIn/pEWJGX5TlQQ+AwaPsMukNSuhf+AXtgtAbk8HkWam9G202wL7dtgSshCV0L8ZSna6jTBIgh9RacD9fBrty2DS6FlmsV2KB3oWwS22O/gPUcUlfAnXlZ7oKW6lawIT9CTw0NdBvoyay/Hb7Kv78HZ0NL9SjYmGPwgIZ2dA1sBc+Rr+ESaLnOgTfBRumtxkB76gYfgecchbHQcjknXoF4wnqtqdCefAB6sTjvNTgPWqZozBF4FWIBnAdVpKu2VzznCxgIp11OdNcOXWt4HYdJuNpFUCUUGQR7wXMcnvaOc+m0yR7w4suy0n8aAX+Cx17UUEGuIy+DD8bzdB7+votnU+V4jkXwdg11egR8uh6fraGibgHXpbghP52DTdP94IW+zErFGgcxZ6Zo6ID6QMRqP2lolj6EKg3Ug1lPHHIdkb/teUYMTZFDySf9M7gmlMmJbiPiRqx/M1SRc+Zb8LzhGpqhj8ELzM9K5YrcxPDlg/y7gWKVADHWpk+zUhP0MHiB76BRbziMnKhO+HvAxu8Az10KjfQkWO8PMD7rdJk3HAIv0igU6QcR6dau8v3BFFh7WbTrMIp16CkNnS1DirXgBdZoKFEP2AnWq19f1AzwmDlI/c7KeIibeElDM/QCeAFz76s1FMiEaQNYb2Nerpe23WAdNynURbAYtOlE5kKViKDDehq8gGP2Dg0F8sJmfzZmD1wFZXoQrOc8ewIiPPH3I03uVNm458GLOHEbhdvGVdbTQ1VxsbVbRLIJiiKE/y031SKFNW4aCWV6BqxnfFQ1ZdUh2BPrwF5wDna6jEYdHjZO7zMMyuQ4d9jpZh0yyWgUhIs0DfXJlcl9LIecN+JOSRI6FwyjvQF5Ay6EIln3dbCePeGETUKXg2PVhjkfXFnL5DoRAeNv0LQ4qKPSTbrbZ8N0h40ma+3c+R7cl0pCPl3ngQ1zy783FEk37HyIrE9XeQMkIfeSTPZtmOFC2eaagWG4YXEF7gpJyCe8EqInekGR3FyIuOlXMH1NSm402zgTHVPKItloJ7P1HH59ISkNBV2mvt+8u0jeqMe9CeOneIWWjGq3/+doKJA7Hh73RnxFlqQi3Xwfina/IzOzx9ycTlIGZjbSHikKsV0jDKOt4zZOkjJFjSH1mIY66cU+B4/rXpNVxFCmqkW6Dzx+EJKb2KEbwRXZXLjMha4Gb2RmVkpUsT+0JCudKnPoWC/K1pQk5GaBjRyQlU6V+0Ye951e0nKnzobaM07qej0EHjdkSVq+AYqh8zbUu97J4LGFWSlx+beJH8AGe1O+vNQN+0+dyC+SSVXb0/WwHOIFSi1upiUTmleVyZPDyWG2HlxjTHUTVlvbv5q1Vzw5UMvpAAAAAElFTkSuQmCC";
if (args.Length != 1)
{
Console.WriteLine("Specify 1 to generate image, specify 2 to compare inputs as an argument.");
return;
}
bool result = int.TryParse(args[0], out int value);
if (!result)
{
return;
}
if (value == 1)
{
string filePath = RuntimeInformation.FrameworkDescription.StartsWith(".NET Core", StringComparison.OrdinalIgnoreCase) ?
@"C:\repos\tmp\netcoreapp31.txt" : @"C:\repos\tmp\netfx.txt";
RoundImageAndWriteBytes(imageBase64, filePath);
}
else if(value == 2)
{
CompareInputs();
}
void RoundImageAndWriteBytes(string base64Image, string filePath)
{
var bytes = Convert.FromBase64String(imageBase64);
using MemoryStream ms = new MemoryStream(bytes);
using var graphicsPath = new GraphicsPath();
var image = Image.FromStream(ms);
var dim = Math.Min(image.Width, image.Height);
var bmp = new Bitmap(dim, dim);
graphicsPath.AddEllipse(0, 0, dim, dim);
using (var graphics = Graphics.FromImage(bmp))
{
graphics.SmoothingMode = SmoothingMode.AntiAlias;
graphics.FillRectangle(Brushes.Magenta, 0, 0, dim, dim);
graphics.SetClip(graphicsPath);
graphics.DrawImage(image, Point.Empty);
}
bmp.MakeTransparent(Color.Magenta);
using MemoryStream dest = new MemoryStream();
bmp.Save(dest, ImageFormat.Png);
bmp.Save(@"C:\repos\tmp\out.png");
ms.Seek(0, SeekOrigin.Begin);
var finalArray = ms.ToArray();
var finalStr = string.Join(",", finalArray);
File.WriteAllText(filePath, finalStr);
}
void CompareInputs()
{
string netfxText = File.ReadAllText(@"C:\repos\tmp\netfx.txt");
string netcoreappText = File.ReadAllText(@"C:\repos\tmp\netcoreapp31.txt");
byte[] netfxBytes = netfxText.Split(',').Select(s => Byte.Parse(s)).ToArray();
byte[] netcoreappBytes = netcoreappText.Split(',').Select(s => Byte.Parse(s)).ToArray();
Console.WriteLine($"Length -- netfx {netfxBytes.Length}, netcoreapp {netcoreappBytes.Length}");
if (netfxBytes.Length != netcoreappBytes.Length)
{
return;
}
bool different = false;
for (int i = 0; i < netfxBytes.Length; i++)
{
byte netfxByte = netfxBytes[i];
byte netcoreappByte = netcoreappBytes[i];
if (netfxByte != netcoreappByte)
{
different = true;
Console.WriteLine($"Byte changed at index: {i} -- netfx {netfxByte}, netcoreapp {netcoreappByte}");
}
}
if (!different)
{
Console.WriteLine("No differences were found");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment