|
@@ -32,6 +32,30 @@ namespace TEAMModelOS.Controllers.Core
|
|
|
/// </summary>
|
|
|
/// <param name="request"></param>
|
|
|
/// <returns></returns>
|
|
|
+ [HttpPost("convert-emf")]
|
|
|
+ [RequestSizeLimit(100_000_000)] //最大100m左右
|
|
|
+ public IActionResult ConvertEmf(ImageQuangRequest request)
|
|
|
+ {
|
|
|
+ if (string.IsNullOrWhiteSpace(request.base64)) return BadRequest();
|
|
|
+ byte[] obase64data = Convert.FromBase64String(request.base64);
|
|
|
+ using var obase64ms = new MemoryStream(obase64data);
|
|
|
+ var (isimg, type, dupe) = Utils.ImageValidateByStream(obase64ms);
|
|
|
+ if (isimg && type.Equals("emf"))
|
|
|
+ {
|
|
|
+ var pngimagebase64 = Utils.ConvertEMFtoPNG(obase64ms);
|
|
|
+ return Ok(pngimagebase64);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return BadRequest("非EMF圖片格式");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// PNG JPF 圖片輕量化
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="request">支持html base64標籤解析</param>
|
|
|
+ /// <returns></returns>
|
|
|
[HttpPost("image-quant")]
|
|
|
[RequestSizeLimit(100_000_000)] //最大100m左右
|
|
|
public async Task<IActionResult> ImageQuang(List<ImageQuangRequest> request)
|
|
@@ -44,17 +68,17 @@ namespace TEAMModelOS.Controllers.Core
|
|
|
foreach (var item in request)
|
|
|
{
|
|
|
//正則處理,移除空白
|
|
|
- string trim = Regex.Replace(item.base64, @"\s", "");
|
|
|
+ string trim = Regex.Replace(item.base64, @"\s", "");
|
|
|
Match match = rex.Match(trim);
|
|
|
string otype = match.Groups["key1"].Value;
|
|
|
string obase64 = match.Groups["key2"].Value;
|
|
|
byte[] obase64data = Convert.FromBase64String(obase64);
|
|
|
using var obase64ms = new MemoryStream(obase64data);
|
|
|
//驗證圖片格式及位深,判斷是否要處理量化演算
|
|
|
- var (isimg, type, dupe) = Utils.ImageValidateByStream(obase64ms);
|
|
|
+ var (isimg, type, dupe) = Utils.ImageValidateByStream(obase64ms);
|
|
|
if (isimg && (type.Equals("png") || type.Equals("jpg")) && dupe > 8)
|
|
|
{
|
|
|
- string img = string.Empty;
|
|
|
+ string img = string.Empty;
|
|
|
using var quantized = quantizer.QuantizeImage(obase64ms, item.width, item.height); //JPEG,PNG輕量化
|
|
|
if (quantized != null)
|
|
|
{
|
|
@@ -66,12 +90,12 @@ namespace TEAMModelOS.Controllers.Core
|
|
|
string blobpath = $"{item.blob[(item.blob.Trim('/').IndexOf("/") + 1)..]}/{img}"; //處理路徑,避免多餘的字符
|
|
|
await _azureStorage.GetBlobContainerClient(Container).GetBlobClient(blobpath).UploadAsync(obase64ms, new BlobHttpHeaders { ContentType = otype });
|
|
|
}
|
|
|
- using var nbase64ms = new MemoryStream();
|
|
|
+ using var nbase64ms = new MemoryStream();
|
|
|
quantized.Save(nbase64ms, ImageFormat.Png); //保存為PNG格式
|
|
|
byte[] data = nbase64ms.ToArray();
|
|
|
string base64 = $"data:image/png;base64,{Convert.ToBase64String(data)}"; //創建新的img src base64
|
|
|
respons.Add(new { base64 = base64, blob = img });
|
|
|
-
|
|
|
+
|
|
|
// TODO 下面註解,無法解決保存時,真正改變Format32bppArgb為Format8bppIndexed,需要再研究
|
|
|
//ImageCodecInfo imageCodecInfo = ImageCodecInfo.GetImageEncoders().FirstOrDefault(info => info.MimeType == "image/png");
|
|
|
//var parameters = new EncoderParameters(1);
|