使用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中乱码问题的主要内容,如果未能解决你的问题,请参考以下文章