【问题标题】:Flood fill using SkiaSharp使用 SkiaSharp 进行洪水填充
【发布时间】:2022-08-19 05:02:28
【问题描述】:

我正在开发一个应用程序,用户可以在其中从预先确定的集合中添加一个(或多个)图像。这些“基本”图像中的每一个都使用相同的颜色来表示用户可以更改颜色的区域。

基本上 - 我的图像包含一个我希望能够更改颜色的区域 - 使用类似于“洪水填充”功能的东西。

现在我正在使用以下内容:

        var targetColor = color;

        var tableRed = new byte[256];
        var tableGreen = new byte[256];
        var tableBlue = new byte[256];

        for (int i = 0; i < 256; i++)
        {
            tableRed[i] = targetColor.Red;
            tableGreen[i] = targetColor.Green;
            tableBlue[i] = targetColor.Blue;
        }

        paint.ColorFilter =
            SKColorFilter.CreateTable(null, tableRed, tableGreen, tableBlue);

        canvas.DrawBitmap(Image,new SKPoint( drawX, drawY), paint);

虽然这“有效”,但它并没有完全符合我的要求。这将重新着色整个对象,而不仅仅是我想要的像素

我将如何在 SkiaSharp 中执行此操作?

我认为一种选择是通过并获取我在原始图像中使用的特定颜色的每个像素,然后用新颜色替换它。

那种代码会是什么样子? 有没有更有效的方法?

    标签: winforms skiasharp


    【解决方案1】:

    好吧,现在我继续使用 GetPixel() SetPixel() 方法实现了这一点,尽管这似乎比最佳内存占用更多​​。

    for (int y = 0; y < Image.Height; y++)
            {
                for (int x = 0; x < Image.Width; x++)
                {
                    if (drawImage.GetPixel(x, y) == OriginalTincture.GetTinctureColor())
                    {
                        drawImage.SetPixel(x, y, newColor.GetTinctureColor());
                    }
                }
            }
    

    现在我只需要处理这样一个事实,即其中一些图像的像素使用了我想要替换的颜色的稍微不同的阴影

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2013-01-16
      相关资源
      最近更新 更多