首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SkiaSharp旋转照片

使用SkiaSharp旋转照片
EN

Stack Overflow用户
提问于 2017-07-13 17:46:52
回答 2查看 5.4K关注 0票数 7

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

代码语言:javascript
复制
    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文件时,它在图像的顶部和底部都有边距。

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

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-14 18:33:57

您可能想要这样做:

代码语言:javascript
复制
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;
    }
}

这样做的原因(或者您的不能像预期的那样工作)是因为您正在旋转位图本身。您基本上已经拍摄了一张图像,然后在绘制它到第一张图像上复制了一份。因此,您仍然拥有下图的边距。

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

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

希望这能有所帮助。

票数 16
EN

Stack Overflow用户

发布于 2019-10-22 20:13:59

Matthew的解决方案也适用于我,但是当我尝试将位图旋转超过90°或-90°(位图被绘制为“不显示”)时,我遇到了一个问题。我强烈推荐使用这个solution。稍微修改后的结果:

代码语言:javascript
复制
public static SKBitmap Rotate(SKBitmap bitmap, double angle)
    {
        double radians = Math.PI * angle / 180;
        float sine = (float)Math.Abs(Math.Sin(radians));
        float cosine = (float)Math.Abs(Math.Cos(radians));
        int originalWidth = bitmap.Width;
        int originalHeight = bitmap.Height;
        int rotatedWidth = (int)(cosine * originalWidth + sine * originalHeight);
        int rotatedHeight = (int)(cosine * originalHeight + sine * originalWidth);

        var rotatedBitmap = new SKBitmap(rotatedWidth, rotatedHeight);

        using (var surface = new SKCanvas(rotatedBitmap))
        {
            surface.Translate(rotatedWidth / 2, rotatedHeight / 2);
            surface.RotateDegrees((float)angle);
            surface.Translate(-originalWidth / 2, -originalHeight / 2);
            surface.DrawBitmap(bitmap, new SKPoint());
        }
        return rotatedBitmap;
    }

在我的例子中,当我需要在Xamarin.iOS平台上旋转图片时,我使用了它(谁曾经尝试过,知道吗),工作得很棒。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45077047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档