Переопределить произвольные оттенки серого в SkiaSharp - PullRequest
0 голосов
/ 19 января 2019

Я строю программу для создания тепловых карт. Я использую код, написанный для GDI +, но по различным причинам Я решил переместить его на SkiaSharp .

В настоящее время у меня есть мозаика изображения в оттенках серого, где белый представляет максимальное значение, а чистый черный - прозрачный. В GDI + / C # я мог бы быстро использовать ColorMap и SetRemapTable. Я посмотрел на ColorFilter, но это похоже на использование матричного преобразования, в отличие от моего несколько произвольного переназначения.

У SkiaSharp есть что-нибудь аналогичное этому? Или я должен вручную перебрать каждый пиксель и перекрасить его?

Исходный код с использованием GDI +:

ImageAttributes imageAttributes = new ImageAttributes();
ColorMap[] remapTable = new ColorMap[256];
Color[] scale = IncandescentHeatScale();

for (int i = 0; i < 256; i++)
{
    remapTable[i] = new ColorMap()
    {
        OldColor = Color.FromArgb(i, i, i),
        NewColor = scale[i]
    };
}

imageAttributes.SetRemapTable(remapTable);

var outTile = new Bitmap(TileSize, TileSize);
using (var g = Graphics.FromImage(outTile))
{
    g.DrawImage(tile, new Rectangle(0, 0, TileSize, TileSize), padding, padding, TileSize, TileSize, GraphicsUnit.Pixel, imageAttributes);
}

Связанные функции, для справки:

static Color[] GetHeatScale(float[] points, Color[] colors)
{
    var bm = new Bitmap(256, 1);
    using (Graphics g = Graphics.FromImage(bm))
    {
        LinearGradientBrush brush = new LinearGradientBrush(new Point(0, 0), new Point(256, 0), colors[0], colors[colors.Length - 1]);
        var cb = new ColorBlend();
        cb.Colors = colors;
        cb.Positions = points;
        brush.InterpolationColors = cb;
        g.FillRectangle(brush, 0, 0, 256, 1);
    }
    return Enumerable.Range(0, 256).Select(x => bm.GetPixel(x, 0)).ToArray();
}


static Color[] IncandescentHeatScale()
{
    float[] points = new float[] { 0.0f, 0.333f, 0.6666f, 1f };
    Color[] colors = new Color[] { Color.Black, Color.DarkRed, Color.Yellow, Color.White };
    return GetHeatScale(points, colors);
}

1 Ответ

0 голосов
/ 24 января 2019

Да, Skia / SkiaSharp позволит вам трансформировать цвета. Помимо использования матричного преобразования, вы можете использовать таблицы переназначения цветов.

Создать SKColorFilter, используя SKColorFilter.CreateTable(alphaRemapTable, redRemapTable, blueRemapTable, greeenRemapTable)

Эти таблицы представляют собой байтовые массивы длиной 256 элементов. Преобразование работает так, что компонент начального цвета используется в качестве индекса для поиска значения, к которому он должен быть переназначен, например. 10 red преобразуется в значение в красном массиве с индексом 10.

Передача нулевого значения в любой из аргументов оставит этот компонент цвета без изменений.

Дальнейшее чтение: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/graphics/skiasharp/effects/color-filters

...