使用SixLabors.ImageSharp写文字的在docker中乱码问题

Posted txb1989

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SixLabors.ImageSharp写文字的在docker中乱码问题相关的知识,希望对你有一定的参考价值。

这两天在SixLabors.ImageSharp往图片上写汉字的时候遇到一个问题就是乱码,在本地因为有对应的字体文件所以很完美,没有任何问题,但是我的服务器是放在docker容器中的。容器简单的不能再简单了,啥都没有,所以一放上去,写啥文字都乱码,尤其是中文

百度,谷歌,bing了很多都是说安装字体库,可以吧Windows的字体文件拷贝到服务器,不晓得别人成功没有,反正我是没成功,我觉得可能没成功的原因是我的docker里面没有fontconfig这个东西,所以就算我把字体拷贝到/usr/share/fonts目录下也是识别不了的(这只是我的猜测)。然而我去安装fontconfig好像也找不到这个安装包。哈哈。无果。

后面看到一篇将SixLabors.ImageSharp的教程https://www.bbsmax.com/A/B0zqm1DQzv/

这里面有讲如何在图片上画文字的做法,他没有读取系统的字体,而是通过new FontCollection().Install方法安装字体,这是一个解决方案啊。。然后模仿他的做法,我也写了一下,然后把字体文件放到我的wwwroot里面

 public string GetMediaId(UserInfo userinfo, string access_token)
        {
            string media_id = string.Empty;
            string baseImage = Path.Combine(_hostingEnvironment.WebRootPath, "images", "base.jpg");
            string fontUrl = Path.Combine(_hostingEnvironment.WebRootPath, "Fonts", "STKAITI.TTF");
            string qrcodeUrl = _userInfoService.GetWechatShareCodeByUserId(userinfo.Id, userinfo.InviteCode);
            Image templateImage = Image.Load(baseImage);
            templateImage.Mutate(x =>
            {
                var qrcodeStream = RequestHelper.CreateRequest(qrcodeUrl).GetStream();
                if (qrcodeStream.IsNotNull())
                {
                    qrcodeStream.Position = 0;
                    Image qrcodeImage = Image.Load(qrcodeStream);
                    qrcodeImage.Mutate(y => y.Resize(130, 130));
                    x.DrawImage(qrcodeImage, new Point(430, 290), 1);
                }


                var headImgStream = RequestHelper.CreateRequest(userinfo.IconUrl).GetStream();
                if (headImgStream.IsNotNull())
                {
                    headImgStream.Position = 0;
                    var iconImage = Image.Load(headImgStream);
                    iconImage.Mutate(y => y.Resize(75, 75));
                    x.DrawImage(iconImage, new Point(20, 70), 1);
                    //Font font = new Font(SystemFonts.Families.FirstOrDefault(), 16);
                    Font font = new Font(new FontCollection().Install(fontUrl), 16);
                    x.DrawText(userinfo.NickName, font, Color.Black, new Point(100, 100));
                }
            });


            //templateImage.Save($"D:/temp/images/{Guid.NewGuid().ToString("N")}.jpg");
            Stream stream = new MemoryStream();
            templateImage.Save(stream, SixLabors.ImageSharp.Formats.Jpeg.JpegFormat.Instance);
            stream.Position = 0;
            media_id = MaterialAPI.UploadTempMedia(access_token, "image", $"{Guid.NewGuid().ToString("N")}.jpg", stream);
            return media_id;
        }

  这类还有个问题,开始我拷贝了一个TTC的字体文件,识别不了,报错,只有TTF的字体可以使用。

以上是关于使用SixLabors.ImageSharp写文字的在docker中乱码问题的主要内容,如果未能解决你的问题,请参考以下文章

Magicodes.IE 2.7.0发布

netcore使用ImageSharp裁切图片

.NET 调整图片尺寸(Resize)各种方法

Magicodes.IE 2.7.0-beta发布

vue中写一个文字滚动小功能~

如何阅读写在图像上的文字?