相关疑难解决方法(0)

绘制剪裁图像时可能会出现抗锯齿效果吗?

目前,我已成功使用Graphics该类绘制非矩形剪裁图像(内部龟):

在此输入图像描述

我的代码看起来像:

using (var g = Graphics.FromImage(image))
{
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

    using (var gfxPath = new GraphicsPath())
    {
        gfxPath.AddEllipse(r);

        using (var region = new Region(r))
        {
            region.Exclude(gfxPath);

            g.ExcludeClip(region);

            g.DrawImage(turtleImage, r, r2, GraphicsUnit.Pixel);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都按预期工作.我不知道如何解决的是使图像边框消除锯齿.

放大的图像看起来像:

在此输入图像描述

即图像结束的边界和图像的透明"背景"开始是粗略的,而不是平滑的α混合.

我的问题是:

是否可以剪切绘制的图像并使抗锯齿处于活动状态?

.net c# graphics system.drawing clipping

7
推荐指数
1
解决办法
3707
查看次数

VisualStyleRenderer到位图

我需要绘制一个不同的进度条VisualStyleRenderer.如果我使用一切正常GraphicsOnPaint方法.但是因为我想将它保存在硬盘中,我需要在Bitmap对象中渲染进度条然后保存它.

这是示例代码

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.DrawImage(RenderProgressbarImage(), new Point(5, 5));

    //following code works good
    progressRenderer.SetParameters("PROGRESS", 11, 2);
    progressRenderer.DrawBackground(e.Graphics, new Rectangle(125, 5, 100, 13));
}
VisualStyleRenderer progressRenderer = new VisualStyleRenderer(VisualStyleElement.ProgressBar.Bar.Normal);
Bitmap RenderProgressbarImage()
{
    Bitmap bmp = new Bitmap(100, 13);
    using (Graphics g = Graphics.FromImage((Image)bmp))
    {
        progressRenderer.SetParameters("PROGRESS", 11, 2);
        progressRenderer.DrawBackground(g, new Rectangle(0, 0, bmp.Width, bmp.Height));                
    }
    return bmp;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我在Bitmap中绘制它,它有黑色角落而不是透明.但是,如果它使用GraphicsOnPaint,一切都吸引好.

截图

c# gdi+

5
推荐指数
1
解决办法
491
查看次数

SkiaSharp 剪切路径

我正在使用 System.Drawing 进行一些图像编辑,现在将所有内容移植到 SkiaSharp 以便在 Linux / .NET Core 上使用它。一切工作正常,除了我还没有找到一种以编程方式为图像提供圆角的方法。

我编写了一些代码,这些代码依赖于以圆形形式绘制路径,然后尝试将路径的外部着色为透明。但这不起作用,因为看起来有多个层,并且使上层的部分透明并不会使图像的整个区域(所有层)透明。这是我的代码:

public static SKBitmap MakeImageRound(SKBitmap image)
{
    SKBitmap finishedImage = new SKBitmap(image.Width, image.Height);

    using (SKCanvas canvas = new SKCanvas(finishedImage))
    {
       canvas.Clear(SKColors.Transparent);
       canvas.DrawBitmap(image, new SKPoint(0, 0));
       SKPath path = new SKPath();
       path.AddCircle(image.Width / 2, image.Height / 2, image.Width / 2 - 1f);
       path.FillType = SKPathFillType.InverseEvenOdd;
       path.Close();
       canvas.DrawPath(path, new SKPaint {Color = SKColors.Transparent, Style = SKPaintStyle.Fill });
       canvas.ResetMatrix();              
       return finishedImage;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这是错误的代码,我很抱歉,这是我第一次使用 C# 进行图像编辑,因此我也是 SkiaSharp 的绝对初学者。我修改了从这里获得的 System.Drawing 代码。

我还看了 …

.net c# .net-core skiasharp

1
推荐指数
1
解决办法
1517
查看次数

标签 统计

c# ×3

.net ×2

.net-core ×1

clipping ×1

gdi+ ×1

graphics ×1

skiasharp ×1

system.drawing ×1