使用 SkiaSharp 调整大小时 iPhone 图像方向错误

2023-12-23

我在 Xamarin.Forms 项目上使用 SkiaSharp 中的 SKBitmap.Resize() 方法来调整图像大小以供显示。我遇到的问题是在 iOS 上拍照时,当纵向拍摄照片时,图像显示为右侧朝上。在 Android 上拍照、从 Android 和 iOS 设备上的照片库导入都会保持方向,但在 iOS 中拍照则不会。如果我不使用 SkiaSharp 调整图像大小(仅显示图像而不调整大小),则图像会以正确的方向显示。但这不是解决方案,因为需要调整图像大小。下面是我的代码 -

private byte[] GetResizedImageData(string imageName)
    {
        float resizeFactor = 0.5f;
        var filePath = PathUtil.GetImagePath(imageName);
        var ogBitmap = SKBitmap.Decode(filePath);

        float fWidth = ogBitmap.Width * resizeFactor;
        int width = (int) Math.Round(fWidth);

        float fHeight = ogBitmap.Height * resizeFactor;
        int height = (int) Math.Round(fHeight);

        if (height >= 4096 || width >= 4096)
        {
            width = width * (int)resizeFactor;
            height = height * (int)resizeFactor;
        }

        var scaledBitmap = ogBitmap.Resize(new SKImageInfo( width, height), SKBitmapResizeMethod.Box);
        var image = SKImage.FromBitmap(scaledBitmap);
        var data = image.Encode(SKEncodedImageFormat.Jpeg, 100);

        return data.ToArray();
    }

PathUtil.GetImagePath() 只是获取照片存储位置的特定于平台的路径的帮助程序。


对于那些有同样问题的人,我做了以下工作,并很乐意接受改进意见。

        public static SKBitmap HandleOrientation(SKBitmap bitmap, SKCodecOrigin orientation)
    {
        SKBitmap rotated;
        switch (orientation)
        {
            case SKCodecOrigin.BottomRight:

                using (var surface = new SKCanvas(bitmap))
                {
                    surface.RotateDegrees(180, bitmap.Width / 2, bitmap.Height / 2);
                    surface.DrawBitmap(bitmap.Copy(), 0, 0);
                }

                return bitmap;

            case SKCodecOrigin.RightTop:                                                 
                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;

            case SKCodecOrigin.LeftBottom:
                rotated = new SKBitmap(bitmap.Height, bitmap.Width);

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

                return rotated; 

            default:                       
                return bitmap;            
        }

然后使用以下方法获取原始方向。

            // TODO: Improve this.. I do not know how to "reset" 
            // the inputStream, so new it up twice. :/
            using (var inputStream = new SKManagedStream(imageIn))
            {
                using (var codec = SKCodec.Create(inputStream))
                {
                    orientation = codec.Origin;
                }
            }

………… 然后

SKBitmap orientedWExif = HandleOrientation(resized, orientation);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SkiaSharp 调整大小时 iPhone 图像方向错误 的相关文章

随机推荐

  • 如何从标签函数调用原生 es6 模板字符串替换?

    我正在为模板文字编写一个 es6 标记函数 它首先检查字符串中的条件 如果未找到条件 则仅将模板文字解释为未标记 我很好奇 从我的标签函数中 是否有一种方法可以调用浏览器的本机模板文字函数 我认为这会比我自己实现的功能 Bonue 有了这个
  • 向 Word 文档添加标题?

    我想使用 PowerShell 将自定义标头添加到 doc 文件 我的意思是实际标头 而不是标题 这应该有效 Word New Object ComObject Word Application wdSeekPrimaryHeader 1
  • qDebug() 的错误输出(UTF - 8)

    我正在尝试存储带有特殊字符的字符串 qDebug lt lt ABCg 输出 这里我什至无法输入正确的输出 在 之后缺少一些垃圾 ABCg 我怀疑有一些 UTF 8 Latin1 ASCII 但找不到输出到控制台 文件的设置 我在代码中写的
  • 为什么每次重新部署时都需要刷新连接池?

    我已经通过 Glassfish 成功连接到远程 MySQL 服务器 但是每次更改代码或 XHTML 文件时 我都需要打开 Glassfish 的管理员面板并刷新连接池 否则会出现以下错误我只是刷新页面 有人经历过这个吗 如果需要的话我可以发
  • 从非主线程绘制到主窗体画布

    我正在尝试为我的学校项目制作一款街机游戏 基本思想是在主线程之外的其他线程中完成所有数学和绘图 并且仅将主线程用于输入例程 绘图是通过保存在外部单元中的过程完成的 并且是通过创建位图 然后在位图上绘制部分环境 最后在主窗体的画布上绘制位图来
  • RoundRobin 函数方法 - 为什么我的函数有副作用?

    客观的 我正在尝试创建一个循环算法 https en wikipedia org wiki Round robin scheduling https en wikipedia org wiki Round robin scheduling
  • 覆盖查询集的更新方法 - Django

    我们如何更改 django 中查询集的 update 方法的默认过程 因为它不会为每个对象调用 save 方法 由于我已经重写了 save 方法 因此每次更改对象时都需要调用它 我寻找Django 文档 https docs djangop
  • AntiXSS JavaScriptEncode 获取 HTML 编码?

    我刚刚开始使用 AntiXSS 4 3 0 主要是为了使用 Encoder JavaScriptEncode如上所述here http weblogs asp net jongalloway preventing javascript en
  • 如何在默认范围内按相关型号订购? -- 轨道 3.1

    如何编写以下默认范围 class SimilarMerchant lt ActiveRecord Base relationships belongs to merchant belongs to similar merchant fore
  • Java swing 禁用窗口

    I would like to disable the window in my swing application here is a picture to demonstrate what I mean My paint skills
  • jBPM 5:数据库表脚本在哪里?

    我在 JBPM 5 4 中创建了一个关于持久性的简单示例 它运作成功并且 记录已成功插入到创建的架构中的表中 但我的问题是 虽然该表是在架构中创建的 但它还创建了其他三个表 节点实例日志 变量实例日志 进程实例日志 但是创建这些表的脚本在哪
  • 通过Python创建文件和目录

    我在创建目录然后打开 创建 写入指定目录中的文件时遇到问题 我似乎不清楚原因 我正在使用 os mkdir 和 path chap name print Path chap path For debugging purposes if no
  • 使用http而不是https的redirect_uri

    我正在使用 spring stack Spring Boot 2 0 1 RELEASE 来创建一个通过 OAuth2 将用户身份验证 注册委托给 Facebook 的网站 当我单击 使用 facebook 登录 按钮时 我会被重定向到 F
  • jQuery 查找并替换第二个

    我想知道如何查找和替换 div 中的某些文本 但我想查找并替换该文本的第二次出现 例如 您刚刚添加了一个项目 请删除该项目 所以我想找到第二个 项目 并将其替换为我选择的任何文本 JS var compareCount compareWid
  • SQL日期格式和引用混乱

    我有以下测试记录 以下查询结果为 0 条记录 SELECT FROM events dates WHERE start date 21 12 2014 但以下查询结果为 1 条记录 SELECT FROM events dates WHER
  • 用 | 分割字符串java中的分隔符

    我有一个像这样的字符串 1 value 我想拆分该字符串并选择 作为分隔符 我的代码如下所示 String separated line split 我得到的是一个包含所有字符作为一个条目的数组 separated 0 separated
  • 为什么FolderBrowserDialog对话框不滚动到选定的文件夹?

    如该屏幕截图所示 所选文件夹不在视图中 需要向下滚动才能查看所选文件夹 同一对话框显示在不同计算机上可见的选定文件夹 我在两台装有 Windows 7 的计算机上运行它 它在一台计算机上运行正常 但在第二台计算机上运行不正常 它看起来与 W
  • 应用程序委托 - Cocoa

    我想将 applicationDidFinishLaunching 合并到我的可可委托中 我该怎么做 在 iphone SDK 上 applicationDidFinishLaunching 已经在应用程序委托中 但在制作我的 mac 应用
  • 如何对数据进行分箱以删除低计数?

    我想出于保护隐私的目的使用装箱来处理数据 数据涉及数字整数 并且必须以频率高于最小值的方式进行分箱 x 我还想最小化垃圾箱的宽度 以尽可能多地保留数据 最小化 bin 的宽度并没有严格定义 因为这只是避免不必要的数据丢失的一般目标 由于整数
  • 使用 SkiaSharp 调整大小时 iPhone 图像方向错误

    我在 Xamarin Forms 项目上使用 SkiaSharp 中的 SKBitmap Resize 方法来调整图像大小以供显示 我遇到的问题是在 iOS 上拍照时 当纵向拍摄照片时 图像显示为右侧朝上 在 Android 上拍照 从 A