1

マップにポイントを追加するのに苦労しています。このマップ上にピンがいくつあっても、各ピンは独自の色になります。色相だけ変えたい

このようなテンプレートpngを使用しています

ここに画像の説明を入力

新しいポイントが発生すると、このファイルがランダムに色付けされる関数を作成したいと思います。

どうすればいいですか?

私が取り組んでいる以下のコード - マトリックスにランダムな値をスローして、色相で十分に離れた適切な色を出力する方法を理解できません

 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;
}

ここに画像の説明を入力

4

2 に答える 2

2

チャート、グラフ、グリッド、またはマップ上の色を区別することに関して、人間の目はそれほどうまく機能しないことがかなりよく文書化されています. 推奨される上限は 8 色から 15 色まであります (閲覧者が色盲ではないことを前提としています)。パレットを使ったほうがいいかもしれません。

可能なピンの数を増やしたい場合は、パレット内の色の数に、簡単に識別できる形状 (円、三角形、正方形など) を掛けることができます。ツートーン アプローチ (太い境界線と内側の色) を使用することもできます。これにより、合計数 (色 * 形状) が 2 乗されます。

したがって、8 色、4 つの形状、および 2 トーンの配色を想定すると、1,024 個のユニークなピンを表すことができます。

詳細については、色とデータの視覚的表現に関する次の優れた記事をご覧ください: http://www.perceptualedge.com/articles/visual_business_intelligence/rules_for_using_color.pdf

于 2013-03-19T21:20:42.603 に答える
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);
}
于 2013-03-19T22:25:26.203 に答える