微软 Power Automate调用Plugin插件执行代码实现图片降素转换Base64功能
在PowerPlatform特定开发的场景中, 需要调用一些外部API,图片转换为Base64作为参数传递,那么参数又不允许过大,所以有时需要将图片降速处理
降素代码:
using Microsoft.Xrm.Sdk;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace LeverStyleAction
{
public class CompressedPixelAction : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
try
{
// 获取 Base64 编码的图像字符串并进行处理
string inputImageBase64 = context.InputParameters["inputImageBase64"]?.ToString()?.Trim();
if (string.IsNullOrEmpty(inputImageBase64))
throw new Exception("输入图像无效。");
byte[] imageBytes = Convert.FromBase64String(inputImageBase64);
string outputImageBase64 = "";
int width, height;
// 处理图像
using (MemoryStream ms = new MemoryStream(imageBytes))
using (Image img = Image.FromStream(ms))
{
width = img.Width;
height = img.Height;
// 根据图片尺寸动态调整缩放比例
float scaleFactor = GetScaleFactor(width, height);
// 计算新的宽度和高度
int newWidth = (int)(width * scaleFactor);
int newHeight = (int)(height * scaleFactor);
// 缩小图像
using (Bitmap imgResized = new Bitmap(newWidth, newHeight))
using (Graphics g = Graphics.FromImage(imgResized))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(img, 0, 0, newWidth, newHeight);
// 降低 DPI 至 96,并设置压缩质量
imgResized.SetResolution(96, 96);
outputImageBase64 = ConvertToBase64Jpeg(imgResized);
}
}
// 设置输出参数
context.OutputParameters["OutputImageBase64"] = outputImageBase64;
context.OutputParameters["OutputImagewidth"] = width;
context.OutputParameters["OutputImageheight"] = height;
}
catch (Exception ex)
{
context.OutputParameters["OutputImageBase64"] = "Error: " + ex.Message;
}
}
// 根据图片的宽度和高度来计算缩放比例
private float GetScaleFactor(int width, int height)
{
// 设置一个阈值
const int largeImageThreshold = 2000; // 大图的宽度阈值
const float maxScaleFactor = 0.25f; // 最大缩小比例
const float minScaleFactor = 0.5f; // 最小缩小比例
if (width > largeImageThreshold || height > largeImageThreshold)
{
// 对大图进行更大比例的缩小
return maxScaleFactor;
}
else if (width > 1000 || height > 1000)
{
// 对中等大小的图像进行适度的缩小
return 0.5f;
}
else
{
// 对小图像进行较小的缩小
return minScaleFactor;
}
}
private string ConvertToBase64Jpeg(Bitmap imgResized)
{
using (MemoryStream outputMs = new MemoryStream())
{
var encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 90L); // 设为 90% 的质量
var codecInfo = GetEncoderInfo(ImageFormat.Jpeg);
imgResized.Save(outputMs, codecInfo, encoderParams);
return Convert.ToBase64String(outputMs.ToArray());
}
}
private ImageCodecInfo GetEncoderInfo(ImageFormat format)
{
foreach (var codec in ImageCodecInfo.GetImageDecoders())
{
if (codec.FormatID == format.Guid)
return codec;
}
return null;
}
}
}
将代码封装成一个Action供Power Automate调用执行
执行之后的效果就是降素后的Base64了
感谢大佬指正 小Monkey
如果你觉得有用的话,就留个赞吧!蟹蟹