Verwenden von System.Drawing.Common in Linux/Docker

Verwenden von System.Drawing.Common in Linux/Docker

Vorwort

Nachdem das Projekt auf .net Core migriert wurde, können wir die Komponente System.Drawing.Common verwenden, um Bild- und Bitmap-Typen zu betreiben und Bestätigungscodes, QR-Codes, Bildoperationen und andere Funktionen zu generieren. Die Komponente System.Drawing.Common hängt von GDI+ ab, aber es gibt kein GDI+ unter Linux. Nachdem ich für Google programmiert hatte, fand ich heraus, dass das Mono-Team die GDI+ -Schnittstelle in der Programmiersprache C implementiert hatte, wodurch Nicht-Windows-Systeme auf die GDI+-Schnittstelle zugreifen konnten. Dies sollte libgdiplus sein. Wenn Sie den System.Drawing.Common -Code stabil unter Linux ausführen möchten, müssen Sie daher die Komponente libgdiplus installieren. Jetzt werden die meisten davon von Docker freigegeben. Wie installiere ich libgdiplus schnell und einfach?

Installieren Sie libgdiplus

Lösung 1

Erstellen Sie mit libgdiplus basierend auf mcr.microsoft.com/dotnet/core/aspnet:3.1 von Microsoft ein Image neu. Das Problem besteht jedoch darin, dass es bei einer zukünftigen Aktualisierung der Version erneut neu erstellt werden muss. Wenn Sie ein Skript zum automatischen Erstellen schreiben, tritt natürlich kein Problem auf. Ha ha

Lösung 2

Das ist auch das, was ich derzeit verwende. Ich installiere libgdiplus beim Erstellen des Anwendungsimages. Da die Systemimagequelle jedoch aus dem Ausland stammt, ist die Installation von libgdiplus sehr langsam und unerträglich. Wir haben die Quelladresse des Systempakets in die Quelladresse des Alibaba Cloud-Pakets geändert und das Problem wurde gelöst. Das Referenz Dockerfile lautet wie folgt:

VON 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 
Führen Sie apt-get update -y und apt-get install -y libgdiplus und apt-get clean aus und führen Sie es in folgendem Befehl aus: /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
ARG-PROJEKT
ARBEITSVERZEICHNIS /app
...

Ersetzen Sie die Paketquelladresse. Bitte beachten Sie, dass das offizielle Image die Quelle von debian anstelle von ubuntu verwendet. Zuerst dachte ich, es sei ubuntu und es hat lange gefehlt.

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

Extra: Was tun, wenn chinesische Schriftarten fehlen? Einfach

Zusätzlich zu den oben genannten Problemen sind uns auch fehlende Schriftarten aufgefallen, was dazu führte, dass alle chinesischen Schriftarten in den generierten Bildern verstümmelt waren. Mit Chinesisch sind hier die Schriftarten gemeint, die wir selbst mit dem Programm gezeichnet haben. Was ist mit dieser Frage? Ergänzen Sie einfach, was Ihnen fehlt. Wenn Ihnen Schriftarten fehlen, ergänzen Sie einfach die Schriftarten. Basierend auf der obigen Dockerfile -Anpassung:

VON 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 
Führen Sie apt-get update -y und apt-get install -y libgdiplus locales fontconfig und apt-get clean und ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll aus.
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/
HINZUFÜGEN ./fonts/* /usr/share/fonts/truetype/deng/
FÜHREN SIE Fc-Cache -vf && Fc-Liste aus
ENV LANG zh_CN.UTF-8
ARG-PROJEKT
ARBEITSVERZEICHNIS /app
...

Dies ist das Ende dieses Artikels über die Fallstricke bei der Verwendung von System.Drawing.Common in Linux/Docker. Weitere relevante Inhalte zur Verwendung von System.Drawing.Common in Linux Docker finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

<<:  Zusammenfassung häufig verwendeter Toolfunktionen in Vue-Projekten

>>:  Kurze Analyse der geplanten MySQL-Sicherungsaufgaben

Artikel empfehlen

Analyse des Prinzips des dynamischen Proxys des Mybatis-Mappers

Vorwort Bevor wir mit der Erklärung des Prinzips ...

Über die Überlappung von Randwert und vertikalem Rand in CSS

Rand paralleler Boxen (Überlappung doppelter Ränd...

Bringen Sie Ihnen bei, wie Sie den Beobachtermodus in Javascript implementieren

Inhaltsverzeichnis Was ist das Beobachtermuster? ...

Detaillierte Analyse des Diff-Algorithmus in React

Verständnis des Diff-Algorithmus in React diff -A...

Ideen und Methoden zur inkrementellen Sicherung einer MySQL-Datenbank

Um eine inkrementelle Sicherung der MySQL-Datenba...

Einige Verbesserungen in MySQL 8.0.24 Release Note

Inhaltsverzeichnis 1. Verbindungsmanagement 2. Ve...

Über das Vue Virtual Dom-Problem

Inhaltsverzeichnis 1. Was ist virtueller Dom? 2. ...

MySQL-Join-Abfragesyntax und Beispiele

Verbindungsabfrage: Es ist das Ergebnis der paarw...

Detailliertes Verständnis des Lebenszyklusvergleichs zwischen Vue2 und Vue3

Inhaltsverzeichnis Zyklusvergleich Verwendung Zus...

Benutzerdefinierte Tabbar-Komponente für das WeChat-Applet

In diesem Artikel wird der spezifische Code der b...