在 Mac OS X 上使用 libgdiplus 的 DotNet Core 图像抗锯齿
DotNet Core image antialias using libgdiplus on Mac OS X
使用 libgdiplus 的 DotNet Core 应用程序在 Mac 上不会出现抗锯齿。无论是使用 Mono 还是 CoreCompat System.Drawing.Image.
都会发生这种情况
不完全确定我了解内部结构;然而,在 Windows 上,我认为这是使用 GDI+,而在 Mac 上,libgdiplus 使用 Cairo。
在 PC 上(左)调整大小的图像很棒,但使用完全相同的代码在 Mac OS X(右)上别名。
是否有任何见解可以解决 macOS 目标的这种不兼容问题?
用于调整图像大小的代码:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace DrawingTest
{
internal class Program
{
public static void Main(string[] args)
{
var image = Image.FromFile(@"/users/jsturges/master.png");
var resized = ResizeImage(image, 256, 256);
resized.Save(@"/users/jsturges/resized-mac.png");
}
public static Bitmap ResizeImage(Image image, int width, int height)
{
var ratioX = width / (float)image.Width;
var ratioY = width / (float)image.Height;
var ratio = Math.Min(ratioX, ratioY);
var scaleWidth = (int)Math.Floor(image.Width * ratio);
var scaleHeight = (int)Math.Floor(image.Height * ratio);
var bitmap = new Bitmap(scaleWidth, scaleHeight, PixelFormat.Format32bppRgb);
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
var rect = new Rectangle(0, 0, scaleWidth, scaleHeight);
graphics.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return bitmap;
}
}
}
用于测试调整大小操作的原始图像available here。
CoreCompat 的 Frederik Carlier 建议添加对以下内容的引用:
这复制了 macOS 所需的依赖项,包括解决抗锯齿问题的更新版本的 libgdiplus。
目前是 CoreCompat 的解决方法,CoreCompat 的 System.Drawing 库将在 netstandard 2.0 发布后更新。
使用 libgdiplus 的 DotNet Core 应用程序在 Mac 上不会出现抗锯齿。无论是使用 Mono 还是 CoreCompat System.Drawing.Image.
都会发生这种情况不完全确定我了解内部结构;然而,在 Windows 上,我认为这是使用 GDI+,而在 Mac 上,libgdiplus 使用 Cairo。
在 PC 上(左)调整大小的图像很棒,但使用完全相同的代码在 Mac OS X(右)上别名。
是否有任何见解可以解决 macOS 目标的这种不兼容问题?
用于调整图像大小的代码:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace DrawingTest
{
internal class Program
{
public static void Main(string[] args)
{
var image = Image.FromFile(@"/users/jsturges/master.png");
var resized = ResizeImage(image, 256, 256);
resized.Save(@"/users/jsturges/resized-mac.png");
}
public static Bitmap ResizeImage(Image image, int width, int height)
{
var ratioX = width / (float)image.Width;
var ratioY = width / (float)image.Height;
var ratio = Math.Min(ratioX, ratioY);
var scaleWidth = (int)Math.Floor(image.Width * ratio);
var scaleHeight = (int)Math.Floor(image.Height * ratio);
var bitmap = new Bitmap(scaleWidth, scaleHeight, PixelFormat.Format32bppRgb);
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
var rect = new Rectangle(0, 0, scaleWidth, scaleHeight);
graphics.DrawImage(image, rect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, wrapMode);
}
}
return bitmap;
}
}
}
用于测试调整大小操作的原始图像available here。
CoreCompat 的 Frederik Carlier 建议添加对以下内容的引用:
这复制了 macOS 所需的依赖项,包括解决抗锯齿问题的更新版本的 libgdiplus。
目前是 CoreCompat 的解决方法,CoreCompat 的 System.Drawing 库将在 netstandard 2.0 发布后更新。