Я строю программу для создания тепловых карт. Я использую код, написанный для 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);
}