Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET Core ImageSharp图像缩放_C#_.net Core_Imagesharp - Fatal编程技术网

C# .NET Core ImageSharp图像缩放

C# .NET Core ImageSharp图像缩放,c#,.net-core,imagesharp,C#,.net Core,Imagesharp,我有两张图片,一张作为背景,另一张包含签名。 我希望能够根据scalefactor向下/向上缩放签名,但在背景的高度/宽度范围内。 我尝试了AffineTransformBuilder.AppendScale,但没有成功,因此我尝试使用resize来缩放签名。 如何在背景图像的范围内缩放签名图像 图像结果 预期结果 调整大小的实际结果 代码 public class ImageConverter { public byte[] GetPngImage(byte[] plots)

我有两张图片,一张作为背景,另一张包含签名。 我希望能够根据scalefactor向下/向上缩放签名,但在背景的高度/宽度范围内。 我尝试了AffineTransformBuilder.AppendScale,但没有成功,因此我尝试使用resize来缩放签名。 如何在背景图像的范围内缩放签名图像

图像结果 预期结果

调整大小的实际结果

代码

public class ImageConverter 
{

    public byte[] GetPngImage(byte[] plots) 
    {
        var desiredWidth = 250;
        var desiredHeight = 250;

        var Rgba32 backgroundColor = Rgba32.White;
        var Rgba32 foregroundColor = Rgba32.Black;

        var plottedLines = GetPlottedLines(plots);

        var minX = lines.Min(p => p.Start.X > p.End.X ? p.Start.X : p.End.X);
        var maxX = lines.Max(p => p.Start.X > p.End.X ? p.Start.X : p.End.X);
        var minY = lines.Min(p => p.Start.Y > p.End.Y ? p.Start.Y : p.End.Y);
        var maxY = lines.Max(p => p.Start.Y > p.End.Y ? p.Start.Y : p.End.Y);

        var width = maxX - minX;
        var height = maxY - minY;

        var scaleFactor = CalculateScaleFactor(width, height, desiredWidth, desiredHeight);

            using (var canvas = new Image<Rgba32>(desiredWidth, desiredHeight))
            using(var signature = new Image<Rgba32>(width, height))
            {
                signature.Mutate(ctx =>
                {
                    var pen = new Pen<Rgba32>(foregroundColor, 1);

                    foreach (var line in plottedLines)
                    {
                        ctx.DrawLines(pen, new PointF(line.Start.X - minX, line.Start.Y - minY),
                            new PointF(line.End.X - minX, line.End.Y - minY));
                    }

                    ctx.Resize(new ResizeOptions
                    {
                        Size = new Size(desiredWidth, desiredHeight),
                        Mode = ResizeMode.BoxPad,
                    });

                    //var transformX = ((desiredWidth / 2f) - (width * scaleFactor) / 2f) < 0f ? 0f : ((desiredWidth / 2f) - (width * scaleFactor) / 2f);

                    //var transformY = ((desiredHeight / 2f) - (height * scaleFactor) / 2f) < 0f ? 0f : ((desiredHeight / 2f) - (height * scaleFactor) / 2f);

                    //var transformBuilder = new AffineTransformBuilder();
                   //transformBuilder.AppendTranslation(new PointF(transformX, transformY));
                   //transformBuilder.AppendScale(scaleFactor);

                   //ctx.Transform(transformBuilder);

                   //var pen = new Pen<Rgba32>(foregroundColor, 1);

                   //foreach (var line in plottedLines)
                   //{
                   //ctx.DrawLines(pen, new PointF(line.Start.X - minX, line.Start.Y - minY), new PointF(line.End.X - minX, line.End.Y - minY));
                   //}
                });

                canvas.Mutate(ctx =>
                {
                    ctx.Fill(new SolidBrush<Rgba32>(backgroundColor), new RectangleF(0, 0, desiredWidth, desiredHeight));
                    ctx.DrawImage(signature, new Point(0, 0), 1);
                });

                using (var ms = new MemoryStream())
                {
                    canvas.Save(ms, new PngEncoder());
                    return ms.ToArray();
                }
            }
    }

   private List<Line> GetPlottedLines(byte[] plotChunk)
    {
        var plotString = Encoding.Default.GetString(plotChunk);
        var lines = plotString.Split(new[] {"|"}, StringSplitOptions.RemoveEmptyEntries);

        return lines.Select(line =>
                line.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries))
            .Select(points => new Line(
                new Point(Convert.ToInt32(points[0]), Convert.ToInt32(points[1])),
                new Point(Convert.ToInt32(points[2]), Convert.ToInt32(points[3]))))
            .ToList();
    }

    private float CalculateScaleFactor(float currentImageWidthInPixels, float currentImageHeightInPixels,
        int desiredWidthInPixels, int desiredHeightInPixels)
    {
        var scaleFactorWidth = desiredWidthInPixels / currentImageWidthInPixels;
        var scaleFactorHeight = desiredHeightInPixels / currentImageHeightInPixels;

        var scaleFactor = scaleFactorWidth < scaleFactorHeight ? scaleFactorWidth : scaleFactorHeight;

        return scaleFactor == 0.0 ? 1.0f : scaleFactor;
    }

    private class Line
    {
        internal Point Start { get; }
        internal Point End { get; }

        public Line(Point start, Point end)
        {
            Start = start;
            End = end;
        }
    }
}
公共类图像转换器
{
公共字节[]GetPngImage(字节[]绘图)
{
var desiredWidth=250;
var desiredHeight=250;
var Rgba32 backgroundColor=Rgba32.White;
var Rgba32 foregroundColor=Rgba32.黑色;
var plottedLines=GetPlottedLines(绘图);
var minX=lines.Min(p=>p.Start.X>p.End.X?p.Start.X:p.End.X);
var maxX=lines.Max(p=>p.Start.X>p.End.X?p.Start.X:p.End.X);
var minY=lines.Min(p=>p.Start.Y>p.End.Y?p.Start.Y:p.End.Y);
var maxY=lines.Max(p=>p.Start.Y>p.End.Y?p.Start.Y:p.End.Y);
变量宽度=最大值-最小值;
变量高度=最大值-最小值;
var scaleFactor=CalculateScaleFactor(宽度、高度、desiredWidth、desiredHeight);
使用(var canvas=新图像(desiredWidth、desiredHeight))
使用(var签名=新图像(宽度、高度))
{
signature.Mutate(ctx=>
{
var笔=新笔(foregroundColor,1);
foreach(绘制线中的变量线)
{
ctx.DrawLines(画笔,新点F(line.Start.X-minX,line.Start.Y-minY),
新的PointF(line.End.X-minX,line.End.Y-minY);
}
ctx.调整大小(新的调整大小选项)
{
尺寸=新尺寸(所需宽度、所需高度),
模式=ResizeMode.BoxPad,
});
//var transformX=((所需宽度/2f)-(宽度*缩放因子)/2f)<0f?0f:((所需宽度/2f)-(宽度*缩放因子)/2f);
//变量转换=((期望高度/2f)-(高度*缩放因子)/2f)<0f?0f:((期望高度/2f)-(高度*缩放因子)/2f);
//var transformBuilder=新的仿射transformBuilder();
//AppendTranslation(新的PointF(transformX,transformY));
//transformBuilder.AppendScale(scaleFactor);
//ctx.Transform(transformBuilder);
//var笔=新笔(foregroundColor,1);
//foreach(绘制线中的变量线)
//{
//绘图线(画笔,新的点F(line.Start.X-minX,line.Start.Y-minY),新的点F(line.End.X-minX,line.End.Y-minY));
//}
});
canvas.Mutate(ctx=>
{
填充(新的SolidBrush(背景色),新的矩形F(0,0,desiredWidth,desiredHeight));
ctx.DrawImage(签名,新点(0,0,1);
});
使用(var ms=new MemoryStream())
{
Save(ms,newpngencoder());
返回ToArray女士();
}
}
}
私有列表GetPlottedLines(字节[]plotChunk)
{
var plotString=Encoding.Default.GetString(plotChunk);
var lines=plotString.Split(新[]{“|”},StringSplitOptions.RemoveEmptyEntries);
返回行。选择(行=>
line.Split(新[]{,“},StringSplitOptions.RemoveEmptyEntries))
.选择(点=>新行(
新点(转换为点32(点[0]),转换为点32(点[1]),
新点(Convert.ToInt32(点[2]),Convert.ToInt32(点[3]))
.ToList();
}
专用浮点计算比例因子(浮点currentImageWidthInPixels、浮点currentImageHeightInPixels、,
整数期望宽度像素,整数期望高度像素)
{
var scaleFactorWidth=所需的宽度像素/当前图像宽度像素;
var scaleFactorHeight=所需的像素高度/currentImageHeightInPixels;
var scaleFactor=scaleFactorWidth
我真的不明白这里的问题。我真的不明白这里的问题。