SkiaSharp SKbitmap.GetPixel 和 SKbitmap.SetPixel - 提高性能

2023-12-23

我正在尝试使用C#和SkiaSharp来实现图像处理。 下面的代码试图实现边缘检测。

下面代码的结果相当不错,需要改进,但这不是我的观点:

用于测试代码的图像 https://i.stack.imgur.com/EZgi4.jpg

canvas.Clear(SKColors.White);
//  USerskbitmapNEW has been loaded earlier.
SKBitmap image = new SKBitmap(USerskbitmapNEW.Width, USerskbitmapNEW.Height);

for (int i = 0; i < image.Width; i++)
{
    for (int j = 0; j < image.Height; j++)
    {
        SKColor c1 = USerskbitmapNEW.GetPixel(i, j - 1);
        SKColor c2 = USerskbitmapNEW.GetPixel(i, j + 1);
        int xval = 0;
        int yval = 0;
        xval = (int)(c1.Red * .3 + c2.Blue * 0.11 - (c2.Red * .3));
        yval = (int)(c2.Red * .3 + c2.Green * .29 + c2.Blue * 0.11);

        if (xval > yval )
        {
            SKColor c = SKColors.Black;
            image.SetPixel(i, j, c);
        }
    }
}

canvas.DrawBitmap(image, myframe);

我的问题是方法: SKbitmap.GetPixel(i, j);和 SKbitmap.SetPixel(i, j, 颜色);当使用大于 200kb 的图像时,速度非常慢。

与上述方法(.GetPixel.SetPixel)相反,当您应用图像各种滤镜时,例如,var cf = SKColorFilter.CreateTable(null, null, colorTable, colorTable); ....skiasharp 非常快。

我的问题:是否有其他方法使用skiasharp来读取和修改图像的像素,并且性能比我描述的方法更好?

提前致谢 米哈利斯


你需要忘记GetPixel/SetPixel如果您想直接访问像素,请使用方法。

对于初学者,您可以直接访问像素数据SKBitmap using GetPixels method:

IntPtr pixelsPtr = image.GetPixels();

然后,在unsafe上下文中,您可以快速操作数据(您需要手动计算像素偏移,以及通过 uint 或字节值设置颜色)。

unsafe
{
    var unsafePtr = (uint*)pixelsPtr.ToPointer();
    for (int y = 1; y < image.Height - 1; y++)
    {
        var rowOffset = y * image.Width;
        
        for (int x = 0; x < image.Width; x++)
        {
            uint c1 = unsafePtr [rowOffset - image.Width + x];
            uint c2 = unsafePtr [rowOffset + image.Width + x];
            // now you should have c1/c2 uints representing RGBA pixel data
            // you can manipulate those and store back via unsafePtr
...
        }
    }
}

我不会为您重写整个逻辑,我可以看到还有一个问题,即您动态更改像素颜色,因此在 (x, y) 坐标处设置黑色将导致像素 (x, y) 处的错误计算+ 1)

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

SkiaSharp SKbitmap.GetPixel 和 SKbitmap.SetPixel - 提高性能 的相关文章

随机推荐