c# - 使用 SkiaSharp 旋转照片

标签 c# .net skiasharp

我尝试使用 SkiaSharp 将照片旋转到 90 度,代码如下:

    public SKBitmap Rotate()
    {
        var bitmap = SKBitmap.Decode("test.jpg");
        using (var surface = new SKCanvas(bitmap))
        {
            surface.RotateDegrees(90, bitmap.Width / 2, bitmap.Height / 2);
            surface.DrawBitmap(bitmap.Copy(), 0, 0);
        }

        return bitmap;
     }

但是当我将位图保存到 JPEG 文件时,图像的顶部和底部都有边距。

原图:/image/7eY2o.jpg 。 旋转图像:/image/IWZTr.jpg .

我做错了什么?

最佳答案

您可能想做这样的事情:

public static SKBitmap Rotate()
{
    using (var bitmap = SKBitmap.Decode("test.jpg"))
    {
        var rotated = new SKBitmap(bitmap.Height, bitmap.Width);

        using (var surface = new SKCanvas(rotated))
        {
            surface.Translate(rotated.Width, 0);
            surface.RotateDegrees(90);
            surface.DrawBitmap(bitmap, 0, 0);
        }

        return rotated;
    }
}

造成这种情况的原因(或者您的原因没有按预期工作)是您正在自行旋转位图。您基本上已经拍摄了一张图像,然后制作了一个副本并将其绘制到第一张图像上。因此,您仍然拥有下图中的边距。

我所做的是创建一个新的位图,然后将解码后的位图绘制到其上。

第二个“问题”是您正在旋转图像,但没有更改 Canvas 尺寸。如果位图为 50x100,然后旋转 90 度,则位图现在为 100x50。由于创建位图后实际上无法更改其尺寸,因此必须创建一个新位图。您可以在输出图像中看到这一点,因为它实际上被剪掉了一点。

希望这有帮助。

关于c# - 使用 SkiaSharp 旋转照片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45077047/

相关文章:

c# - 向动态添加的控件添加事件

c# - 简化相对 URL

winforms - 如何在 Windows.Forms 应用程序中渲染 SKBitmap?

c# - Linq 加入包含语句

c# - Ninject基类和继承类绑定(bind)到同一个实例

javascript - 如何调用c#编写的javascript函数,c#中按钮的onkeypress

c# - 删除 C# 不安全指针

c# - 为什么 Debug 构建中的 C# JIT 汇编代码中的每个方法中都有 cmp + je

glsl - 使用 SkiaSharp 自定义片段着色器

wpf - 在 SkiaSharp 中绘制旋转文本