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

#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
{
/// <summary>图像实用工具。</summary>
public sealed class ImageUtility
{
internal static byte[] EmptyBytes { get { return new byte[0]; } }
/// <summary>保存图像到文件,失败时返回 NULL 值。</summary>
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;
}
/// <summary>保存为 PNG 文件,失败时返回 NULL 值。</summary>
public static byte[] SaveAsPng(Image image, bool dispose = false)
{
return SaveAsBytes(image, ImageFormat.Png, dispose);
}
/// <summary>保存为 JPEG 文件,失败时返回 NULL 值。</summary>
public static byte[] SaveAsJpeg(Image image, bool dispose = false)
{
return SaveAsBytes(image, ImageFormat.Jpeg, dispose);
}
/// <summary>生成二维码图像,可指定色块边长像素值和纠错率,失败时返回 NULL 值。</summary>
public static Bitmap GenerateQrCode(string text, int block = 8)
{
return GenerateQrCode(text, block, Color.Black, Color.White);
}
/// <summary>生成二维码图像,可指定色块边长像素值和纠错率,失败时返回 NULL 值。</summary>
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; }
}
/// <summary>从 RGBA 十六进制字符串获取颜色。</summary>
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