微软 Power Automate调用Plugin插件执行代码实现图片降素转换Base64功能

微软 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
如果你觉得有用的话,就留个赞吧!蟹蟹

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猴麦麦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值