吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 858|回复: 0
收起左侧

[求助] ImageSharp库使用ProcessPixelRows方法,貌似效率没有提高很多,还不如bitmap,写错?

[复制链接]
ilovecomputer66 发表于 2023-1-21 13:51
如果普通用for循环,用imageSharp的索引进行处理。测试图需要800毫秒。 用上ProcessPixelRows,只降低到平均720毫秒
而用bitmap.lock,然后用unsafe的byte*操作,只有125毫秒。 span是C#比较新版本,封装的对指针安全使用,效率与原生使用unsafe指针,看网上文章基本差不多。但为什么imageSharp ProcessPixelRows效率如此低?
我感觉应该代码写错了,但这就是照着官方demo写的,也没看出哪写的不对,请大佬指点了
如果普通用for循环,用imageSharp的索引进行处理

[C#] 纯文本查看 复制代码
SixLabors.ImageSharp.Image<Rgba32> oriImage = SixLabors.ImageSharp.Image.Load<Rgba32>(config.OriPicPath);
                    SixLabors.ImageSharp.Image<Rgba32> resultImage = SixLabors.ImageSharp.Image.Load<Rgba32>(config.ResultPicPath);
                    int width = oriImage.Width;
                    int height = oriImage.Height;

                    Rgba32 oriPixel;
                    Rgba32 resultPixel;

                    for (int x = 0; x < width; x++)
                    {
                        for (int y = 0; y < height; y++)
                        {
                            resultPixel = resultImage[x, y];
                            if (resultPixel.A > 0)
                            {
                                oriPixel = oriImage[x, y];
                                resultImage[x, y] = new Rgba32(oriPixel.R, oriPixel.G, oriPixel.B, resultPixel.A);
                            }
                        }
                    }

                    string newFilePath = Path.Combine(Path.GetDirectoryName(config.OriPicPath), Path.GetFileNameWithoutExtension(config.OriPicPath) + "_do" + Path.GetExtension(config.ResultPicPath));
                    FileStream fileStream = new FileStream(newFilePath, FileMode.Create);
                    PngEncoder pngEncoder = new PngEncoder();
                    resultImage.Save(fileStream, pngEncoder);
                    fileStream.Close();



然后是用上ProcessPixelRows

[C#] 纯文本查看 复制代码
SixLabors.ImageSharp.Image<Rgba32> oriImage = SixLabors.ImageSharp.Image.Load<Rgba32>(config.OriPicPath);
                    SixLabors.ImageSharp.Image<Rgba32> resultImage = SixLabors.ImageSharp.Image.Load<Rgba32>(config.ResultPicPath);
                    int width = oriImage.Width;
                    int height = oriImage.Height;

                    resultImage.ProcessPixelRows(oriImage, (resultAccessor, oriAccessor) =>
                    {
                        for (int y = 0; y < height; y++)
                        {
                            Span<Rgba32> resultRow = resultAccessor.GetRowSpan(y);
                            Span<Rgba32> oriRow = oriAccessor.GetRowSpan(y);

                            for (int x = 0; x < width; x++)
                            {
                                ref Rgba32 resutPixel = ref resultRow[x];
                                if (resutPixel.A > 0)
                                {
                                    ref Rgba32 oriPixel = ref oriRow[x];
                                    resutPixel = new Rgba32(oriPixel.R, oriPixel.G, oriPixel.B, resutPixel.A);
                                }
                            }
                        }
                    });

                    string newFilePath = Path.Combine(Path.GetDirectoryName(config.OriPicPath), Path.GetFileNameWithoutExtension(config.OriPicPath) + "_do" + Path.GetExtension(config.ResultPicPath));
                    FileStream fileStream = new FileStream(newFilePath, FileMode.Create);
                    PngEncoder pngEncoder = new PngEncoder();
                    resultImage.Save(fileStream, pngEncoder);
                    fileStream.Close();

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:39

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表