Linux中的dotnet core 2.1+ System.Drawing.Common的grapic DrawImage丢失透明性

时间:2019-09-10 07:28:12

标签: linux .net-core gdi+ system.drawing

我正在尝试使用dotnetcore的system.drawing.common@4.5将水印添加到jpeg图片中,在我的PC开发环境中一切正常,但是当它在linux服务器上运行时,图像的质量会下降。

string inputFile = "inputFile.jpg";
string waterMarkFile = "waterMark.png";
var wmImage = Image.FromFile(waterMarkFile);
FileInfo input = new FileInfo(inputFile);
using (var stream = new MemoryStream())
{
    using (var fs = input.OpenRead())
    {
        fs.CopyTo(stream);
        using (var outputStream = new MemoryStream())
        {
            using (var img = Image.FromStream(stream))
            {
                using (var graphic = Graphics.FromImage(img))
                {
                    int initX = img.Width / 2;
                    int initY = img.Height / 2;
                    int wmWidth = img.Width * 0.1 > wmImage.Width ? (int)(img.Width * 0.1) : img.Width;
                    int wmHeight = (wmImage.Height * wmWidth) / wmImage.Width;
                    int offsetX = wmWidth / 2;
                    int offsetY = wmHeight / 2;
                    for (int x = initX; x < img.Width + wmWidth; x += (int)(wmWidth *  2.5))
                    {
                        for (int y = initY; y < img.Height + wmHeight; y += (int)(wmHeight * 2.5))
                        {
                            graphic.DrawImage(wmImage, x - offsetX, y - offsetY, wmWidth, wmHeight);
                            if (x != initX || y !=initY)
                            {
                                graphic.DrawImage(wmImage, initX - (x - initX) - offsetX , y - offsetY, wmWidth, wmHeight);
                                graphic.DrawImage(wmImage, initX - (x - initX) - offsetX, initY - (y - initY) - offsetY, wmWidth, wmHeight);
                                graphic.DrawImage(wmImage, x - offsetX, initY - (y - initY) - offsetY, wmWidth, wmHeight);
                            }
                        }
                    }
                    img.Save($"wm_{inputFile}");
                }
            }
        }
    }
}
wmImage.Dispose();

1 个答案:

答案 0 :(得分:1)

问题依然存在。我在使用基于 Debian 的 aspnet 核心映像(3.1-buster-slim、5.0-buster-slim)时遇到了同样的问题。看起来这里将安装旧版本的 libgdiplus。在本地环境中运行应用程序对我来说不是解决方案(一切都必须在 kubernetes pods 上运行...)

我找到了两个解决方案:

  1. 使用基于 Ubuntu 的映像(3.1-focal、5.0-focal)
  2. 使用 Debian (buster-slim) 镜像,从 github 克隆当前的 libgdiplus 并在镜像内编译。

我为这两个场景创建了 Dockerfiles 并发布了一个 GitHub repository