如何将位图更改为另一种随机颜色?

时间:2013-03-19 21:07:03

标签: c# image-processing

我想把点添加到地图上。无论此地图上有多少个引脚,每个引脚都会有自己的颜色。我只想改变色调

我正在使用看起来像这样的模板png

enter image description here

我想创建一个函数,当一个新点出现时,这个文件会随机变色。

我该怎么做?

下面的代码我正在使用 - 我无法弄清楚如何在矩阵中抛出随机值以输出在颜色上调足够远的任何好颜色

 private Bitmap ColorMyPin()
{
    Image imgPicture = Properties.Resources.green_MarkerBlank;

    Bitmap bmp = new Bitmap(imgPicture.Width, imgPicture.Height);


    ImageAttributes iaPicture = new ImageAttributes();
    ColorMatrix cmPicture = new ColorMatrix(new float[][]
    {
        new float[] {0, 0, 0, 0, 0},
        new float[] {0, 0, 0, 0, 0},
        new float[] {0, 0, 0, 0, 0},  <-- //Hard part where do i throw random() values at
        new float[] {0, 0, 0, 0, 0},
        new float[] {0, 0, 0, 0, 0}
    });


    // Set the new color matrix
    iaPicture.SetColorMatrix(cmPicture);

    // Set the Graphics object from the bitmap
    Graphics gfxPicture = Graphics.FromImage(bmp);

    // New rectangle for the picture, same size as the original picture
    Rectangle rctPicture = new Rectangle(0, 0, imgPicture.Width, imgPicture.Height);

    // Draw the new image
    gfxPicture.DrawImage(imgPicture, rctPicture, 0, 0, imgPicture.Width, imgPicture.Height, GraphicsUnit.Pixel, iaPicture);

    return bmp;
}

enter image description here

2 个答案:

答案 0 :(得分:2)

有很好的记载,当谈到区分图表,图形,网格或地图上的颜色时,人眼并不是那么好。我已经看到推荐的上限低至8和高达15种独特的颜色(并假设观众不是色盲)。使用调色板可能会更好。

如果要增加可能的引脚数,可以将调色板中的颜色数乘以一些容易区分的形状(圆形,三角形,方形等)。您甚至可以使用双色调方法(粗边框和内部颜色),这会将您的总数(颜色*形状)提升到第二种力量。

因此,假设8种颜色,4种形状和双色调着色方案,您将能够代表1,024个unqiue引脚。

如需进一步阅读,请查看有关颜色和数据可视化表现的优秀文章: http://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf

答案 1 :(得分:2)

我相信你正在寻找ColorMatrix类...我承认我不是一个带图像处理的向导,但这里有一些参考:

这里有一个快速而丑陋的示例代码:

void Main()
{
        var redPinPath = @"c:\temp\pin.png";
        var redPin = Bitmap.FromFile(redPinPath);

        var window1 = new Form();
        window1.BackgroundImage = redPin;
        window1.Show();

        for(var hue = 0.01f; hue < Math.PI; hue += 0.01f)
        {
            var pinCopy = Bitmap.FromFile(redPinPath);
            AlterHue(hue, pinCopy);
            window1.BackgroundImage = pinCopy;
            window1.Invalidate();
            Application.DoEvents();
        }
}

// Define other methods and classes here
public void AlterHue(float newHue, Image image)
{
    var lumR = 0.213f;
    var lumG = 0.715f;
    var lumB = 0.072f;
    var cosVal = (float) Math.Cos(newHue);
    var sinVal = (float) Math.Sin(newHue);
    var imgGraphics = Graphics.FromImage(image);
    var pinAttributes = new ImageAttributes();
    var colorMatrix = new ColorMatrix(new float[][]
    {
        new float[] {lumR + cosVal * (1 - lumR) + sinVal * (-lumR),     lumG + cosVal * (-lumG) + sinVal * (-lumG),         lumB + cosVal * (-lumB) + sinVal * (1 - lumB), 0, 0},
        new float[] {lumR + cosVal * (-lumR) + sinVal * (0.143f),         lumG + cosVal * (1 - lumG) + sinVal * (0.140f),     lumB + cosVal * (-lumB) + sinVal * (-0.283f), 0, 0},
        new float[] {lumR + cosVal * (-lumR) + sinVal * (-(1 - lumR)),     lumG + cosVal * (-lumG) + sinVal * (lumG),             lumB + cosVal * (1 - lumB) + sinVal * (lumB), 0, 0},
        new float[] {0, 0, 0, 1, 0},
        new float[] {0, 0, 0, 0, 1}
    });

    var sizeRect = new Rectangle(0, 0, image.Width, image.Height);
    pinAttributes.SetColorMatrix(colorMatrix);
    imgGraphics.DrawImage(image, sizeRect, 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, pinAttributes);
}