#if NET40 || NET461 using Apewer; using Apewer.Internals; using Apewer.Internals.QrCode; using Apewer.Models; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Text; namespace Apewer.Surface { /// 图像实用工具。 public sealed class ImageUtility { internal static byte[] EmptyBytes { get { return new byte[0]; } } /// 保存图像到文件,失败时返回 NULL 值。 public static byte[] SaveAsBytes(Image image, ImageFormat format, bool dispose = false) { if (image == null) return EmptyBytes; var memory = new MemoryStream(); var bytes = null as byte[]; try { image.Save(memory, format); bytes = memory.ToArray(); } catch { } memory.Dispose(); if (dispose) image.Dispose(); return bytes; } /// 保存为 PNG 文件,失败时返回 NULL 值。 public static byte[] SaveAsPng(Image image, bool dispose = false) { return SaveAsBytes(image, ImageFormat.Png, dispose); } /// 保存为 JPEG 文件,失败时返回 NULL 值。 public static byte[] SaveAsJpeg(Image image, bool dispose = false) { return SaveAsBytes(image, ImageFormat.Jpeg, dispose); } /// 生成二维码图像,可指定色块边长像素值和纠错率,失败时返回 NULL 值。 public static Bitmap GenerateQrCode(string text, int block = 8) { return GenerateQrCode(text, block, Color.Black, Color.White); } /// 生成二维码图像,可指定色块边长像素值和纠错率,失败时返回 NULL 值。 public static Bitmap GenerateQrCode(string text, int block, Color dark, Color light) { var t = text ?? ""; var b = block > 1 ? block : 1; var ecclevel = QRCodeGenerator.ECCLevel.M; // var ecc = QrCodeEccLevel.M; // if (ecc == QrCodeEccLevel.L) ecclevel = QRCodeGenerator.ECCLevel.L; // else if (ecc == QrCodeEccLevel.M) ecclevel = QRCodeGenerator.ECCLevel.M; // else if (ecc == QrCodeEccLevel.Q) ecclevel = QRCodeGenerator.ECCLevel.Q; // else if (ecc == QrCodeEccLevel.H) ecclevel = QRCodeGenerator.ECCLevel.H; try { var generator = new QRCodeGenerator(); var content = generator.CreateQrCode(t, ecclevel); var qrcode = new QRCode(content); var bitmap = qrcode.GetGraphic(b, dark, light, false); return bitmap; } catch { return null; } } /// 从 RGBA 十六进制字符串获取颜色。 public static Color GetColorByHex(string hex, Color @default) { var lower = hex.ToLower(); if (lower == "none" || lower == "alpha" || lower == "transparent") { return Color.Transparent; } else { const string pool = "0123456789abcdef"; lower = TextUtility.Restrict(lower, pool); if (lower.Length >= 6) { var r = pool.IndexOf(lower[0]) * 16 + pool.IndexOf(lower[1]); var g = pool.IndexOf(lower[2]) * 16 + pool.IndexOf(lower[3]); var b = pool.IndexOf(lower[4]) * 16 + pool.IndexOf(lower[5]); var a = 255; if (lower.Length >= 8) { a = pool.IndexOf(lower[6]) * 16 + pool.IndexOf(lower[7]); } var color = Color.FromArgb(a, r, g, b); return color; } } return @default; } } } #endif