Forráskód Böngészése

update utiles emp to png base64 test

JAELYS 4 éve
szülő
commit
504b586933

+ 38 - 1
TEAMModelOS.SDK/Extension/Utils.cs

@@ -3,6 +3,7 @@ using Microsoft.IdentityModel.Tokens;
 using System;
 using System.Collections.Generic;
 using System.Drawing;
+using System.Drawing.Drawing2D;
 using System.Drawing.Imaging;
 using System.IdentityModel.Tokens.Jwt;
 using System.IO;
@@ -144,14 +145,50 @@ namespace TEAMModelOS.SDK.Extension
 
                 return (true, "png", depth);
             }
-
+            
             if (fileheader.StartsWith("47,49,46,38,39,61,") || fileheader.StartsWith("47,49,46,38,37,61,"))
                 return (true, "gif", 0);
+
+            if (fileheader.StartsWith("1,0,0,0,"))
+                return (true, "emf", 0);
+
+            if (fileheader.StartsWith("1,0,9,0,0,3"))
+                return (true, "wmf", 0);
             //if (fileheader.StartsWith("4D,4D") || fileheader.StartsWith("49,49") || fileheader.StartsWith("46,4F,52,4D"))
             //    return (true, "tif");
             return (false, "", 0);
 
         }
+
+        /// <summary>
+        /// 轉換EMF為PNG格式
+        /// </summary>
+        /// <param name="stream"></param>
+        /// <returns></returns>
+        public static string ConvertEMFtoPNG(Stream stream) 
+        {
+            using var image = Image.FromStream(stream);
+
+            //var size = GetImageOptimizationSize(new Size(image.Width, image.Height), MaxWidth * MaxHeight,
+            //    requestedPixel);
+
+            //var width = size.Width;
+            //var height = size.Height;
+
+            var pngimage = new Bitmap(image.Width, image.Height);
+            using (var graphics = Graphics.FromImage(pngimage))
+            {
+                graphics.CompositingQuality = CompositingQuality.HighSpeed;
+                graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
+                graphics.CompositingMode = CompositingMode.SourceCopy;
+                graphics.DrawImage(image, 0, 0, image.Width, image.Height);
+                using var nbase64ms = new MemoryStream();
+                pngimage.Save(nbase64ms, ImageFormat.Png); //保存為PNG格式
+                byte[] data = nbase64ms.ToArray();
+                string base64 = Convert.ToBase64String(data);
+                return base64;
+            }
+        }
         #endregion
 
 

+ 29 - 5
TEAMModelOS/Controllers/Core/CoreController.cs

@@ -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);