使用SkiaSharp旋转照片

Dmi*_*try 4 .net c# 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;
     }
Run Code Online (Sandbox Code Playgroud)

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

原图:http://imgur.com/pGAuko8.旋转图像:http://imgur.com/bYxpmI7.

我究竟做错了什么?

Dat*_*tch 18

马修的解决方案也适用于我,但当我尝试将位图旋转超过 90\xc2\xb0 或 -90\xc2\xb0 (位图被绘制为“显示之外”)时,我遇到了问题。我强烈建议使用这个[解决方案] 1。稍微修改一下结果:

\n
public static SKBitmap Rotate(SKBitmap bitmap, double angle)\n    {\n        double radians = Math.PI * angle / 180;\n        float sine = (float)Math.Abs(Math.Sin(radians));\n        float cosine = (float)Math.Abs(Math.Cos(radians));\n        int originalWidth = bitmap.Width;\n        int originalHeight = bitmap.Height;\n        int rotatedWidth = (int)(cosine * originalWidth + sine * originalHeight);\n        int rotatedHeight = (int)(cosine * originalHeight + sine * originalWidth);\n\n        var rotatedBitmap = new SKBitmap(rotatedWidth, rotatedHeight);\n\n        using (var surface = new SKCanvas(rotatedBitmap))\n        {\n            surface.Clear();\n            surface.Translate(rotatedWidth / 2, rotatedHeight / 2);\n            surface.RotateDegrees((float)angle);\n            surface.Translate(-originalWidth / 2, -originalHeight / 2);\n            surface.DrawBitmap(bitmap, new SKPoint());\n        }\n        return rotatedBitmap;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

就我而言,当我需要在 Xamarin.iOS 平台上旋转图片时,我使用了这个(曾经尝试过这个的人都知道),它就像一个魅力。

\n


Mat*_*hew 10

你可能想做这样的事情:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个(或者你没有按预期工作)的原因是你正在自己旋转位图.您基本上拍摄了一张图像,然后将其复制到第一张图像上.因此,您仍然可以从下面的图像中获得边距.

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

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

希望这可以帮助.