RHEL8.5解决libgdiplus绘图问题

news2025/3/1 18:59:37

最近有客户服务器使用RHEL8.5了。由于之前测试和编译的dotnetcore在Linux下绘图包libgdiplus都是在centos7.6编译的。把CentOS7.6编译的二进制程序之前试CentOS7.9使用没问题,然后RHEL8.5无法正常绘图。由于之前搞统信那些系统发现了包得在对应系统源码编译才行。所以就试着自己安装虚拟机编译。

安装虚拟机的过程很蛋疼,首先到网上下载一个800多兆的安装包,在安装系统时候需要输入机构名称和机构秘钥,看来企业版就是费劲额,我一个穷光蛋怎么可能为了编译程序去买个,为此就搁置了。

搁置几周后看项目搞虚拟机费劲,还得自己捣腾,为此问系统部要了个他们的系统下载地址,包有10个G,百度云盘限速100k下载了一天半只到3G,为此花了10块钱大洋提速,呜呜呜,真黑。

在这里插入图片描述

下载完成后正常虚拟机安装系统。安装完之后试着编译libgdiplus。执行yum安装编译环境时候提示没注册,不能运行yum,当时吓了一跳,不会还要买授权吧。。。

后面看是提示没注册、yum仓库不让用,就到网上配置成阿里云的yum。执行下面命令。

cd /etc/yum.repos.d/
rm *.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
yum makecache

执行完之后可以用yum了,然后就编译:

yum -y install gcc automake autoconf libtool make
yum -y install gcc-c++
yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel


yum install -y autoconf automake libtool

yum install -y freetype-devel fontconfig libXft-devel

yum install -y libjpeg-turbo-devel libpng-devel giflib-devel libtiff-devel libexif-devel

yum install -y glib2-devel cairo-devel   

yum install -y pango-devel

yum install giflib

yum install libexif

yum install git

git clone https://github.com/mono/libgdiplus

cd libgdiplus

chmod +x autogen.sh

chmod +x configure

./autogen.sh  --with-pango

make

make install

cd /usr/lib64/

ln -s /usr/local/lib/libgdiplus.so gdiplus.dll

编译完成后把src下生成的libs二进制拷贝出来和自己写的install.sh脚本打包,就得到了安装的二进制包。

传给项目测试发现还行不能画出图。然后就把自己写的最简单的画图测试控制台到虚拟机测试。

测试代码如下:

using System;
using System.Drawing;

namespace lisdrawtest
{
    /// <summary>
    /// 供检验测试绘图环境
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("此程序为imedicallis提供用于测试linux下dotnetcore绘图环境");
            Console.WriteLine("创建位图");
            //创建空位图
            Image img = new Bitmap(300, 140);
            Console.WriteLine("创建画笔");
            //获得画图句柄
            Graphics g = Graphics.FromImage(img);
            Console.WriteLine("填充白色");
            g.Clear(Color.White);
            Console.WriteLine("创建Pen");
            Pen pen = new Pen(Color.Black);
            pen.Width = 1;
            //画横纵坐标线
            Console.WriteLine("画一条竖线");
            g.DrawLine(pen, 50, 100, 300, 100);
            Console.WriteLine("画一条横线");
            g.DrawLine(pen, 50, 100, 50, 0);
            Console.WriteLine("创建字体");
            Font myFont = new Font("宋体", 12, FontStyle.Regular);
            Console.WriteLine("创建画刷");
            Brush brush = new SolidBrush(Color.Black);
            Console.WriteLine("绘制字符串");
            g.DrawString("ZhangLainZhu test", myFont, brush, 10, 10);
            Console.WriteLine("保存文件到:"+ System.IO.Path.Combine(AppContext.BaseDirectory, "lisdrawtest.bmp"));
            if (System.IO.File.Exists(System.IO.Path.Combine(AppContext.BaseDirectory,"lisdrawtest.bmp")))
            {
                System.IO.File.Delete(System.IO.Path.Combine(AppContext.BaseDirectory, "lisdrawtest.bmp"));
            }
            img.Save(System.IO.Path.Combine(AppContext.BaseDirectory, "lisdrawtest.bmp"));
            Console.WriteLine("测试完成,如果成功生成图片那么环境可用");
        }
    }
}

发现能成功绘图。。。我了个去,还能见鬼不成
在这里插入图片描述

然后又到项目服务器捣腾了几个小时,一直报“No codec available for format:b96b3cae-0728-11d3-9d7b-0000f81ef32e”,然后就百度、必应各种查资料,基本没资料,只知道b96b3cae-0728-11d3-9d7b-0000f81ef32e是图片的Format格式。然后六点没搞定就先回去了。

查资料过程很曲折:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

把libgdiplus的源码也翻了翻
在这里插入图片描述

回去立马开机准备测试,首先整理思路:
1.项目服务器安装包后报No codec available for format:b96b3cae-0728-11d3-9d7b-0000f81ef32e
2.项目服务器卸载包后报没安装gdiplus。这就说明包安装有效。
3.项目服务器用简单绘图测试程序能画好图,检验在线预览画图报错,而且报format错。那么说明绘图库不存在问题,是不是预览的图形处理用到图片format了导致的。

然后就把图片Save加上指定图片Format测试,在本地虚拟机也没问题。

bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

看来只能在项目服务器测试了。和项目要了个远程,让测试登录个QQ,准备频繁编译dll测试。

先锁定大概位置
在这里插入图片描述

发现日志能走到44,说明得到img了,绘图是成功的,也和报format错误,而简单测试示例能成功印证。为了证实猜想,在img后面调用img.Save保存图片到/zlz.bmp查看。发现确实是检验报告图片。

然后测试点就到转Base64串了。在这里输出3个日志,然后发现是转换Base64异常了。这里原代码是指定图片格式是System.Drawing.Imaging.ImageFormat.Jpeg。
在这里插入图片描述

测试到这里那就应该是Jpeg的事,因为我画的是bmp。把代码改为Bmp编译测试后正常。这个问题应该是有的环境才会出,因为之前CentOS7.6是没毛病的。总算是跟到问题了。旷日持久的RHEL8.5编译libgdiplus以花10块钱提速和半天加班结束。开心,又成长了一丢丢

很多时候要有耐心,解决不了的时候可以从多方面论证来缩小范围,再整理整理心情可能接解决了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java web基于SSM的停车场管理系统的设计与实现

1&#xff0c;项目介绍 Java web基于SSM的停车场管理系统拥有三种角色&#xff0c;分别为用户&#xff0c;管理员&#xff0c;超级管理员。 停车位管理&#xff08;管理员&#xff0c;超级管理员&#xff09;停车卡管理&#xff08;用户&#xff0c;管理员&#xff0c;超级管…

Vue3视频播放器组件Vue3-video-play入门教程

Vue3-video-play适用于 Vue3 的 hls.js 播放器组件 | 并且支持MP4/WebM/Ogg格式。 1、支持快捷键操作 2、支持倍速播放设置 3、支持镜像画面设置 4、支持关灯模式设置 5、支持画中画模式播放 6、支持全屏/网页全屏播放 7、支持从固定时间开始播放 8、支持移动端&#xff0c;移动…

pyqt5环境搭建

1、打开Terminal ,用命令pip install pyqt5-tools 或者 pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple安装PyQt5安装成功后就可看到PyQt5版本2、同上方法&#xff0c;继续安装pyqt5-tools扩展工具&#xff0c;里面包括了QtDesigner等很好用的工具。3、…

二进制哈希码快速搜索:Multi-Index Hashing

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 哈希方法通常包含两个部分&#xff1a; 【编码】将元素通过「data-dependent」或「data-independent」的方式映射为二进制…

C变量区域

C语言中有五大内存分区&#xff0c;分别是栈区、堆区、全局区/静态区、常量区和代码区。1.栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值、局部变量的值等。当调用函数的时候函数中定义的变量会被加到栈中&#xff0c;当函数离开的时候&#xff0c;被添加…

HTML看这一篇就够啦,HTML基础大全,可用于快速回顾知识,面试首选

HTML 1 基础 1.1 DOCTYPE <!DOCTYPE> 文档类型声明&#xff0c;作用就是告诉浏览器使用哪种HTML版本来显示网页。 <!DOCTYPE html> 这句代码的意思是: 当前页面采取的是 HTML5 版本来显示网页. 注意: 声明位于文档中的最前面的位置&#xff0c;处于 标签之前。 …

互联网新理念,对于WEB 3.0 你怎么看?

WEB 3.0 这个名词走进大众视野已经有一段时间了&#xff0c;也曾在各个圈子里火热一时&#xff0c;至今各大互联网企业任旧在 WEB 3.0 上不断探索。但关于 WEB 3.0 是什么这个问题&#xff0c;其实大部分人都没有一个比较明确的认知&#xff0c;包括区块链和元宇宙等相关行业的…

【设计模式】备忘录模式和迭代器模式

备忘录模式和迭代器模式备忘录模式代码示例迭代器模式代码示例使用迭代器遍历集合的同时不能删除/增加元素总结备忘录模式 备忘录模式&#xff0c;也叫快照&#xff08;Snapshot&#xff09;模式。 在 GoF的《设计模式》⼀书中&#xff0c;备忘录模式是这么定义的&#xff1a;…

【Spring6】面向切面:AOP

5.1、场景模拟 搭建子模块&#xff1a;spring6-aop 5.1.1、声明接口 声明计算器接口Calculator&#xff0c;包含加减乘除的抽象方法 public interface Calculator {int add(int i, int j);int sub(int i, int j);int mul(int i, int j);int div(int i, int j);}5.1.2、创建…

计算机视觉与深度学习 | Visual ChatGPT:微软开源视觉(图文)聊天系统——图像生成、迁移学习、边缘检测、颜色渲染等多功能(附代码下载链接)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== Visual ChatGPT: Talking, Drawing and Editing with V

LeetCode 134. 加油站(函数图像法 / 贪心)

题目&#xff1a; 链接&#xff1a;LeetCode 134. 加油站 难度&#xff1a;中等 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中…

CentOS系统变化看开源演进

CentOS社区还存不存在&#xff1f;CentOS项目还存不存在&#xff1f;众多CentOS用户将何去何从&#xff1f;伴随CentOS停更&#xff0c;大家可能会有这样那样的疑问&#xff0c;今天针对以上问题&#xff0c;我来进行一一解答。CentOS实际上有两个变种&#xff0c;一个叫做Cent…

C#和.net框架之第二弹

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、什么是标示符&#xff1f;二、标示符命名规则三、c#命名规范是什么&#xff1f;四、c#命名规范内容五、关键字的用处注意&#xff1a;六、Main方法是干什么的…

12 | 架构案例:基于OAuth 2.0/JWT的微服务参考架构

12 | 架构案例&#xff1a;基于OAuth 2.0/JWT的微服务参考架构 架构图 令牌的校验和转换&#xff0c;将前端传递过来的 OAuth 2.0 访问令牌&#xff0c;通过调用 IDP 进行校验&#xff0c;并转换为包含用户和权限信息的 JWT 令牌&#xff0c;再将 JWT 令牌向后台微服务传递。…

New Bing乘上ChatGPT的东风,日活突破1亿

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 注&#xff1a;本文由松松杰哥缮写&#xff0c;ChatGPT进行了补充和润色&#xff0c;你们可以看看本文和其他文有什么区别&#xff1f; 微软今天宣布&#xff0c;New Bing乘上ChatGPT的东风&#xf…

【设计模式】中介者模式和观察者模式

中介者模式 中介模式的英⽂翻译是 Mediator Design Pattern。 在 GoF 中的《设计模式》⼀书中&#xff0c;它是这样定义的&#xff1a; Mediator pattern defines a separate (mediator) object that encapsulates the interaction between a set of objects and the objects …

C#:Krypton控件使用方法详解(第十五讲) ——kryptonBorderEdge

今天介绍的Krypton控件中的kryptonBorderEdge。下面介绍控件的外观属性如下图所示&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;UseWaitCursor属性&#xff1a;表示鼠标在控件中等待时&#xff0c;以…

大学模拟电路期末考试模拟题详解

&#xff08;一&#xff09;选择题 3.4.5.6.7.8.9.10. &#xff08;二&#xff09;填空题 1.漂流电流是温度电流&#xff0c;它由少数、载流子形成、其大小与温度有关&#xff0c;而与外加电压无关。 反向电流是由少数载流子形成、其大小与温度有关&#xff0c;而与外加电压无…

AOP通知类型:

AOP通知类型&#xff1a; 环绕通知无参与ProceedingJoinPoint接口&#xff1a;方法的前后进行环绕&#xff0c;但是与before和after不同的是&#xff0c;他无法知道下面代码中的环绕前方法是否是在前置位置&#xff0c;后置同理&#xff0c;于是要在方法中添加参数ProceedingJo…

Android之事件机制

Android之事件机制MotionEvent事件的分发与处理触屏事件的类型触摸事件发生的位置触摸事件的分发和处理用于分发和处理的方法事件分发和处理的过程KeyEvent参考MotionEvent事件的分发与处理 在我们日常使用app的时候会进行各种各样的触摸操作&#xff0c;比如点击、长按等&…