我有一个浮点[,]矩阵的值,这段代码我已经能够将矩阵转换成一个位图,最终会在一个pictureBox上绘制。
private unsafe Bitmap ToBitmap(float[,] rawImage)
{
int width = rawImage.GetLength(1);
int height = rawImage.GetLength(0);
Bitmap img = new Bitmap(width, height);
BitmapData bitmapData = img.LockBits(
new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite,
PixelFormat.Format32bppArgb
);
ColorARGB* startingPosition = (ColorARGB*)bitmapData.Scan0;
for (int i = 0; i < height; i++)
for (int j = 0; j < width; j++)
{
double color = rawImage[i, j];
byte rgb = (byte)(color * 255); // lowering this value make the image less saturated, but still grayscale
ColorARGB* position = startingPosition + j + i * width;
position->A = 255;
position->R = rgb;
position->G = rgb;
position->B = rgb;
}
img.UnlockBits(bitmapData);
return img;
}
public struct ColorARGB
{
public byte B;
public byte G;
public byte R;
public byte A;
public ColorARGB(Color color)
{
A = color.A;
R = color.R;
G = color.G;
B = color.B;
}
public ColorARGB(byte a, byte r, byte g, byte b)
{
A = a;
R = r;
G = g;
B = b;
}
public Color ToColor()
{
return Color.FromArgb(A, R, G, B);
}
}
使用此代码,结果是一个graylvl图像,有一些饱和的部分;我想将颜色重新映射成&#34; jet&#34; colormap或&#34; hot&#34;,但我不知道我应该从哪里开始。 这个想法是: 低于阈值且高于阈值的所有矩阵值应使用特定颜色进行映射(在jet cMap的情况下,它们将是红色和蓝色,而2个限制之间的值将映射到所有其他值)。
发布的代码改编自我在网上找到的内容,我该如何处理?我能找到的只是色彩映射的重映射,但要将旧颜色更改为新颜色,而不是整个ColorMapping。