You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
4.0 KiB

4 years ago
  1. #if NET40 || NET461
  2. using Apewer;
  3. using Apewer.Internals;
  4. using Apewer.Internals.QrCode;
  5. using Apewer.Models;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Drawing;
  9. using System.Drawing.Imaging;
  10. using System.IO;
  11. using System.Text;
  12. namespace Apewer.Surface
  13. {
  14. /// <summary>图像实用工具。</summary>
  15. public sealed class ImageUtility
  16. {
  17. internal static byte[] EmptyBytes { get { return new byte[0]; } }
  18. /// <summary>保存图像到文件,失败时返回 NULL 值。</summary>
  19. public static byte[] SaveAsBytes(Image image, ImageFormat format, bool dispose = false)
  20. {
  21. if (image == null) return EmptyBytes;
  22. var memory = new MemoryStream();
  23. var bytes = null as byte[];
  24. try
  25. {
  26. image.Save(memory, format);
  27. bytes = memory.ToArray();
  28. }
  29. catch { }
  30. memory.Dispose();
  31. if (dispose) image.Dispose();
  32. return bytes;
  33. }
  34. /// <summary>保存为 PNG 文件,失败时返回 NULL 值。</summary>
  35. public static byte[] SaveAsPng(Image image, bool dispose = false)
  36. {
  37. return SaveAsBytes(image, ImageFormat.Png, dispose);
  38. }
  39. /// <summary>保存为 JPEG 文件,失败时返回 NULL 值。</summary>
  40. public static byte[] SaveAsJpeg(Image image, bool dispose = false)
  41. {
  42. return SaveAsBytes(image, ImageFormat.Jpeg, dispose);
  43. }
  44. /// <summary>生成二维码图像,可指定色块边长像素值和纠错率,失败时返回 NULL 值。</summary>
  45. public static Bitmap GenerateQrCode(string text, int block = 8)
  46. {
  47. return GenerateQrCode(text, block, Color.Black, Color.White);
  48. }
  49. /// <summary>生成二维码图像,可指定色块边长像素值和纠错率,失败时返回 NULL 值。</summary>
  50. public static Bitmap GenerateQrCode(string text, int block, Color dark, Color light)
  51. {
  52. var t = text ?? "";
  53. var b = block > 1 ? block : 1;
  54. var ecclevel = QRCodeGenerator.ECCLevel.M;
  55. // var ecc = QrCodeEccLevel.M;
  56. // if (ecc == QrCodeEccLevel.L) ecclevel = QRCodeGenerator.ECCLevel.L;
  57. // else if (ecc == QrCodeEccLevel.M) ecclevel = QRCodeGenerator.ECCLevel.M;
  58. // else if (ecc == QrCodeEccLevel.Q) ecclevel = QRCodeGenerator.ECCLevel.Q;
  59. // else if (ecc == QrCodeEccLevel.H) ecclevel = QRCodeGenerator.ECCLevel.H;
  60. try
  61. {
  62. var generator = new QRCodeGenerator();
  63. var content = generator.CreateQrCode(t, ecclevel);
  64. var qrcode = new QRCode(content);
  65. var bitmap = qrcode.GetGraphic(b, dark, light, false);
  66. return bitmap;
  67. }
  68. catch { return null; }
  69. }
  70. /// <summary>从 RGBA 十六进制字符串获取颜色。</summary>
  71. public static Color GetColorByHex(string hex, Color @default)
  72. {
  73. var lower = hex.ToLower();
  74. if (lower == "none" || lower == "alpha" || lower == "transparent")
  75. {
  76. return Color.Transparent;
  77. }
  78. else
  79. {
  80. const string pool = "0123456789abcdef";
  81. lower = TextUtility.Restrict(lower, pool);
  82. if (lower.Length >= 6)
  83. {
  84. var r = pool.IndexOf(lower[0]) * 16 + pool.IndexOf(lower[1]);
  85. var g = pool.IndexOf(lower[2]) * 16 + pool.IndexOf(lower[3]);
  86. var b = pool.IndexOf(lower[4]) * 16 + pool.IndexOf(lower[5]);
  87. var a = 255;
  88. if (lower.Length >= 8)
  89. {
  90. a = pool.IndexOf(lower[6]) * 16 + pool.IndexOf(lower[7]);
  91. }
  92. var color = Color.FromArgb(a, r, g, b);
  93. return color;
  94. }
  95. }
  96. return @default;
  97. }
  98. }
  99. }
  100. #endif