Мне нужно сгенерировать QR-код для некоторых данных, я не хочу использовать System.Drawing.Common. Любой другой подходящий способ генерации QR-кода с использованием C#

При использовании System.Drawing.Common инициализатор типа для Gdip выдал исключение.

Создание API, который должен отправлять QR-код (строку в кодировке Base64) в качестве ответа. Я попробовал использовать библиотеки ZXing и System.Drawing.common для генерации QR-кода, а затем вернуть его в byte[], чтобы его можно было преобразовать в строку base64 для отправки в качестве ответа в .net API.

Есть ли причина, по которой вы не заинтересованы в исправлении этого исключения, а выбираете совершенно другой подход? Верно ли мое предположение о вашей цели?

Fildor 28.05.2024 10:13

Самая первая причина — System.Drawing.Common поддерживается только в Windows. Мой API размещен на сервере Ubuntu. Вторая причина заключается в том, что я использую .net 8, с которым у system.Drawing.common возникают некоторые проблемы. Learn.microsoft.com/en-us/dotnet/core/compatibility/…

user2344219 29.05.2024 04:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
121
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Специально для QR-кодов вы можете использовать QRCoder Nuget -> https://www.nuget.org/packages/QRCoder/

Ему не нужны внешние зависимости, и вы можете получить base64 непосредственно из результата.

QRCodeGenerator qrGenerator = new QRCodeGenerator();
var qrString = $"QR Code string - for other types like urls check the readme in the nuget";
QRCodeData qrCodeData = qrGenerator.CreateQrCode(qrString, QRCodeGenerator.ECCLevel.Q);
PngByteQRCode qrCode = new PngByteQRCode(qrCodeData);
byte[] qrCodeAsPngByteArr = qrCode.GetGraphic(5); // --> also read the readme
string base64String = Convert.ToBase64String(qrCodeAsPngByteArr, 0, qrCodeAsPngByteArr.Length);

Это прямой вывод (png), который вы можете использовать (в качестве примера)

var base64Png = $"<img src='data:image/png;base64,{base64String}' />";

В качестве небрежного замечания я бы посоветовал вообще перестать использовать System.Drawing.Common. Пространство имен System.Drawing имеет некоторые серьезные проблемы при переходе на .NET 6+ и некоторые другие проблемы, связанные с .NET 5 (или более ранней версией). Для получения дополнительной информации прочтите блок «примечаний», выпущенный MS: https://learn.microsoft.com/en-us/dotnet/api/system.drawing?view=net-8.0 («красный» раздел должен дать достаточно информации).

Если вы хотите использовать рисование/изображение и т. д., обратите внимание на другие nugets, например https://www.nuget.org/packages/SixLabors.ImageSharp/ (но есть и другие).

«Я бы посоветовал вообще прекратить использовать System.Drawing.Common» — почему? (Нейтрально в этом отношении: просто подумать о хорошем ответе, содержащем это замечание, также должно быть обосновано для этого предложения)

Fildor 28.05.2024 10:08

Вы правы - я добавлю пояснение

riffnl 28.05.2024 10:10

Еще одно замечание: выбирая SixLabors: обратите внимание на их лицензирование. (Причина, по которой один из наших проектов уходит от него)

Fildor 28.05.2024 10:16

Другие вопросы по теме