using System;
using System.IO;
using QRCoder;
using UnityEngine;
using Color = System.Drawing.Color;
namespace RR.Common.Utility
{
///
/// Утилитарный класс для создания QR-кодов в Unity.
/// Предоставляет статические методы для генерации QR-кодов в виде текстур.
///
public class QRMaker : MonoBehaviour
{
///
/// Создает текстуру QR-кода из переданного текста.
///
/// Текст или данные для кодирования в QR-код.
/// Количество пикселей на один модуль QR-кода. По умолчанию 8.
/// Определяет, нужно ли рисовать тихие зоны (белые поля) вокруг QR-кода. По умолчанию true.
/// Темный цвет в QR-коде
/// Светлый цвет в QR-коде
/// Texture2D с изображением QR-кода, готовая для использования в UI или материалах.
public static Texture2D MakeTexture(string text,
int pixelsPerModule = 8,
bool drawQuietZones = true,
Color darkColor = default,
Color lightColor = default)
{
Color dark = darkColor == default ? Color.Black : darkColor;
Color light = lightColor == default ? Color.White : lightColor;
QRCodeGenerator gen = new();
QRCoder.QRCodeData data = gen.CreateQrCode(text, QRCodeGenerator.ECCLevel.M);
PngByteQRCode png = new(data);
// Генерим PNG-байты с указанными цветами
byte[] bytes = png.GetGraphic(pixelsPerModule, dark, light, drawQuietZones);
Texture2D tex = new(150, 150, TextureFormat.RGBA32, false);
tex.LoadImage(bytes); // раскодирует PNG → RGBA
tex.Apply(false, false);
return tex;
}
// public static Texture2D MakeTexture(string text, Image icon = null, int pixelsPerModule = 8,
// bool drawQuietZones = true)
// {
// QRCodeGenerator gen = new();
// QRCoder.QRCodeData data = gen.CreateQrCode(text, QRCodeGenerator.ECCLevel.M);
// QRCode code = new(data);
// Bitmap bitmapIcon = code.GetGraphic(pixelsPerModule,
// Color.Black,
// Color.White,
// icon == null ? null : new Bitmap(icon),
// 15,
// 10,
// drawQuietZones);
// Texture2D tex = new(150, 150, TextureFormat.RGBA32, false);
// tex.LoadImage(bitmapIcon);
// }
// Сохранить как PNG-файл
public static string SavePng(string text, string filePath, int ppm = 8)
{
QRCodeGenerator gen = new();
QRCoder.QRCodeData data = gen.CreateQrCode(text, QRCodeGenerator.ECCLevel.M);
PngByteQRCode png = new PngByteQRCode(data);
byte[] bytes = png.GetGraphic(ppm, Color.Black, Color.White, true);
File.WriteAllBytes(filePath, bytes);
return filePath;
}
}
///
/// Структура данных для конфигурации генерации QR-кода.
/// Содержит параметры для создания полных ссылок с префиксом и суффиксом.
///
[Serializable]
public struct QRCodeInfo
{
///
/// Флаг, определяющий, нужно ли генерировать QR-код.
///
public bool generateQRCode;
///
/// Префикс ссылки (например, "https://example.com/").
///
public string linkPrefix;
///
/// Суффикс, добавляемый в качестве параметра запроса.
///
public string suffix;
///
/// Темный цвет в QR-коде.
///
public Vector3 darkColor;
///
/// Светлый цвет в QR-коде.
///
public Vector3 lightColor;
public static Color GetColor(Vector3 colorRGB)
{
Color outColor = Color.FromArgb(255,
(int)(colorRGB.x * 255),
(int)(colorRGB.y * 255),
(int)(colorRGB.z * 255));
return outColor;
}
///
/// Формирует полную ссылку, объединяя префикс, данные и суффикс.
///
/// Основные данные для включения в ссылку.
/// Полная ссылка в формате: {linkPrefix}{data}?text={suffix}
public string GetFullLink(string data) => $"{linkPrefix}{data}?text={ProcessSuffix(suffix)}";
private string ProcessSuffix(string rawSuffix) => Uri.EscapeDataString(rawSuffix);
}
}