Using System.Drawing.Common in Linux/Docker

Using System.Drawing.Common in Linux/Docker

Preface

After the project is migrated to .net core, we can use the System.Drawing.Common component to operate Image and Bitmap types to generate verification codes, QR codes, image operations and other functions. The System.Drawing.Common component depends on GDI+, but there is no GDI+ on Linux. After programming for Google, I found that the Mono team implemented the GDI+ interface in C language, providing access to the GDI+ interface for non-Windows systems. This should be libgdiplus . Therefore, if you want to run the System.Drawing.Common code stably on Linux, you must install the component libgdiplus . Now most of them are released by docker. How to install libgdiplus quickly and easily?

Install libgdiplus

Solution 1

Rebuild an image with libgdiplus based on mcr.microsoft.com/dotnet/core/aspnet:3.1 provided by Microsoft, but the problem is that it will have to be rebuilt again if the version is updated in the future. Of course, if you write a script to automatically build it, then there will be no problem. Ha ha

Solution 2

This is also what I am currently using. I install libgdiplus when building the application image. However, because the system image source is from abroad, the installation of libgdiplus is very slow and unbearable. We changed the system package source address to the Alibaba Cloud package source address, and the problem was solved. The reference Dockerfile is as follows:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list 
RUN apt-get update -y && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
ARG PROJECT
WORKDIR /app
...

Replace the package source address. Please note that the official image uses the source of debian instead of ubuntu . At first, I thought it was ubuntu and I failed for a long time.

sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list

Extra: What to do if Chinese fonts are missing? Easy

In addition to the above problems, we also encountered missing fonts, which resulted in all the Chinese fonts in the generated pictures being garbled. The Chinese here refers to the ones we drew ourselves through the program. What about this question? Just make up for what you lack. If you lack fonts, just make up for the fonts. Based on the above Dockerfile adjustment:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list 
RUN apt-get update -y && apt-get install -y libgdiplus locales fontconfig && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
RUN sed -ie 's/#zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen && locale-gen && mkdir /usr/share/fonts/truetype/deng/
ADD ./fonts/* /usr/share/fonts/truetype/deng/
RUN fc-cache -vf && fc-list
ENV LANG zh_CN.UTF-8
ARG PROJECT
WORKDIR /app
...

This is the end of this article about sharing the pitfalls of using System.Drawing.Common in Linux/Docker. For more relevant content about using System.Drawing.Common in linux docker, please search for previous articles on 123WORDPRESS.COM or continue to browse the related articles below. I hope you will support 123WORDPRESS.COM in the future!

<<:  Summary of commonly used tool functions in Vue projects

>>:  Brief analysis of mysql scheduled backup tasks

Recommend

Detailed explanation of Vue router routing guard

Table of contents 1. Global beforeEach 1. Global ...

How to implement a password strength detector in react

Table of contents Preface use Component Writing D...

This article will help you understand the life cycle in Vue

Table of contents 1. beforeCreate & created 2...

Detailed explanation of MySQL date string timestamp conversion

The conversion between time, string and timestamp...

Detailed steps to install Nginx on Linux

1. Nginx installation steps 1.1 Official website ...

About nginx to implement jira reverse proxy

Summary: Configure nginx reverse proxy jira and i...

Detailed explanation of the relationship between Vue and VueComponent

The following case reviews the knowledge points o...

Solution to MySQL connection exception and error 10061

MySQL is a relational database management system ...

A summary of the reasons why Mysql does not use date field index

Table of contents background explore Summarize ba...

Vue implements three-level navigation display and hiding

This article example shares the specific code of ...

Docker Gitlab+Jenkins+Harbor builds a persistent platform operation

CI/CD Overview CI workflow design Git code versio...

Ubuntu boot auto-start service settings

How to create a service and auto-start it in Ubun...

Basic knowledge of website design: newbies please read this

Now many people are joining the ranks of website ...

svg+css or js to create tick animation effect

Previously, my boss asked me to make a program th...