【问题标题】:Skisharp ColorMatrix Invert black/whiteSkisharp ColorMatrix 反转黑/白
【发布时间】:2021-10-08 02:37:09
【问题描述】:

我尝试绘制图像,在第一次绘制之后我想反转绘图的颜色。 如果我的新方块的背景是黑色的,我需要白色,如果是白色,我需要黑色。 在我的示例中,我绘制了 3 个正方形并在 x 中偏移了 10 个像素。

不幸的是,它没有产生想要的结果。

using var skBitmap = new SKBitmap(100, 40);
using var skCanvas = new SKCanvas(skBitmap);
skCanvas.Clear(SKColors.White);

var color = SKColors.Black;
float[] invertMatrix = {
    -1.0f,  0.0f,  0.0f,  0.0f,  255.0f,
    0.0f,  -1.0f,  0.0f,  0.0f,  255.0f,
    0.0f,  0.0f,  -1.0f,  0.0f,  255.0f,
    0.0f,  0.0f,  0.0f,  1.0f,  0.0f
};

using var skPaint = new SKPaint();
skPaint.Color = color;
skPaint.Style = SKPaintStyle.Fill;

skCanvas.DrawRect(10, 10, 20, 20, skPaint);

skPaint.ColorFilter = SKColorFilter.CreateColorMatrix(invertMatrix);

//move +10 in x
skCanvas.DrawRect(20, 10, 20, 20, skPaint);

//move +10 in x
skCanvas.DrawRect(30, 10, 20, 20, skPaint);

【问题讨论】:

    标签: c# skiasharp colormatrix colormatrixfilter


    【解决方案1】:

    不幸的是,没有矩阵,我找到了解决问题的方法。

    using var skBitmap = new SKBitmap(100, 40);
    using var skCanvas = new SKCanvas(skBitmap);
    skCanvas.Clear(SKColors.White);
    
    var color = SKColors.Black;
    
    using var skPaint = new SKPaint();
    skPaint.Color = color;
    skPaint.Style = SKPaintStyle.Fill;
    
    skCanvas.DrawRect(10, 10, 20, 20, skPaint);
    
    DrawInvertRectangle(20, 10, 20, 20, skBitmap);
    DrawInvertRectangle(30, 10, 20, 20, skBitmap);
    
    private static void DrawInvertRectangle(int x, int y, int width, int height, SKBitmap skBitmap)
    {
        using var skPaint = new SKPaint();
        skPaint.Color = SKColors.Black;
        skPaint.Style = SKPaintStyle.Fill;
    
        using var skBitmapInvert = new SKBitmap(skBitmap.Width, skBitmap.Height);
        using var skCanvas = new SKCanvas(skBitmapInvert);
        skCanvas.DrawRect(x, y, width, height, skPaint);
    
        for (var row = 0; row < skBitmapInvert.Height; row++)
        {
            for (var column = 0; column < skBitmapInvert.Width; column++)
            {
                var pixel = skBitmap.GetPixel(column, row);
                var pixelInvert = skBitmapInvert.GetPixel(column, row);
                if (pixelInvert.Alpha == 255 && pixelInvert.Blue == 0 && pixel.Blue == 255)
                {
                    skBitmap.SetPixel(column, row, SKColors.Black);
                }
                if (pixelInvert.Alpha == 255 && pixelInvert.Blue == 0 && pixel.Blue == 0)
                {
                    skBitmap.SetPixel(column, row, SKColors.White);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      在第二次拨打skCanvas.DrawRect 之后,您似乎没有更新颜色。

      此外,在您绘制 20 像素宽的矩形并将它们重叠时,您只需将新矩形向右移动 10 像素。

      按照您想要的示例,您需要进行第四次调用以将颜色更改回黑色,然后调用skCanvas.DrawRect(40, 10, 20, 20, skPaint)

      鉴于您将矩形移动 10 像素并重叠它们,我建议您更新调用以生成 10 像素宽的更薄的初始矩形。

      【讨论】:

      • 当我在白色上画黑色时,正方形应该是完全黑色的。但如果绘图区域已经包含黑色,则该区域应再次变为白色。我需要这个逻辑用于标签打印机项目。
      猜你喜欢
      • 2013-01-09
      • 2015-03-21
      • 2019-07-13
      • 2015-04-07
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2020-01-10
      相关资源
      最近更新 更多