首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Skisharp ColorMatrix反转黑白

Skisharp ColorMatrix反转黑白
EN

Stack Overflow用户
提问于 2021-08-02 18:56:21
回答 2查看 101关注 0票数 0

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

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

代码语言:javascript
复制
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);

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-12 19:57:15

不幸的是,我在没有矩阵的情况下找到了问题的解决方案。

代码语言:javascript
复制
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);
代码语言:javascript
复制
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);
            }
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2021-08-11 07:32:38

看起来在第二次调用skCanvas.DrawRect之后,您并没有更新颜色。

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

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

假设您要将矩形移动10个像素并将其重叠,我建议您更新您的调用,以在10个像素宽的位置生成更薄的初始矩形。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68626710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档