?

Log in

No account? Create an account

System.Drawing.Color наглядно

Названия статических свойств класса System.Drawing.Color не очень наглядны, поэтому решено было их все изобразить на одной картинке в алфавитном порядке:



Если надо решить обратную задачу: по цвету подобрать название, удобнее пользоваться этой картинкой (тоже кликабельно):



А если кто хочет сделать похожую штуку, но только БШ, сырцы под катом.


// Свойства System.Drawing.Color
Type type = typeof(System.Drawing.Color);
var cols = type.GetProperties().Where(x => x.PropertyType == type && x.Name != "Transparent");
int cn = cols.Count();

// Размеры прямоугольников
int W = 1280, H = 800;
double phi = (Math.Sqrt(5) + 1) / 2;
int sx = (int) Math.Round(cn / Math.Sqrt(cn / (W / phi / H))),
    sy = cn / sx + (cn % sx == 0 ? 0 : 1);
int shiftX = (W % sx) / 2, shiftY = (H % sy) / 2;

// Подготовка рисования
Font tahoma = new Font("Tahoma", W <= 800 ? 7 : 8);
Bitmap bmp = new Bitmap(W, H);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.Black);

// Рисование
int i = 0;
foreach (var pi in cols)
{
    Color col = (Color) pi.GetValue(null, null);
    // Прямоугольник
    g.FillRectangle(
        new SolidBrush(col),
        new Rectangle(
            shiftX + (i / sy) * (W / sx) + 1,
            shiftY + (i % sy) * (H / sy) + 1,
            W / sx - 1,
            H / sy - 1
        )
    );
    // Подпись
    string rgb = "#" + col.ToArgb().ToString("X").Substring(2);
    g.DrawString(
        rgb + "\r\n" + pi.Name,
        tahoma,
        col.GetBrightness() < 0.4 || col.A < 100 ? Brushes.White : Brushes.Black,
        shiftX + (i / sy) * (W / sx) + 5f,
        shiftY + (i % sy) * (H / sy) + 5f
    );
    ++i;
}

// Копирайт :)
System.Net.WebClient wc = new System.Net.WebClient();
byte[] lj = wc.DownloadData("http://l-stat.livejournal.com/img/userinfo.gif");
g.DrawImage(
    Image.FromStream(new System.IO.MemoryStream(lj)),
    shiftX + (sx - 1) * (W / sx) + 5f,
    shiftY + (sy - 1) * (H / sy) + 5f
);
g.DrawString("sharpc", tahoma, Brushes.White,
    shiftX + (sx - 1) * (W / sx) + 24f,
    shiftY + (sy - 1) * (H / sy) + 8f
);

// Сохранение и просмотр
bmp.Save("C:\\System_Drawing_Color.png", System.Drawing.Imaging.ImageFormat.Png);
System.Diagnostics.Process.Start("C:\\System_Drawing_Color.png");

Comments

Спасибо.
То, что нужно. Спасибо:)
Хочу научиться быдлокодить. Денис, а как оно делается в GUI?
Не понял вопроса. Эту картинку можно в PictureBox нарисовать, например.
А какие строки надо изменить?
Очень хочется инкапсулировать это дело, чтобы не менять десять строк кода...
Например, можно заменить последние две на
pictureBox1.BackgroundImageLayout = ImageLayout.Center;
pictureBox1.BackgroundImage = bmp;

Спасибо.
И еще одно спасибо.
а почему в foreach (var pi in cols) счетчик называется pi ?
я не могу понять логику, но путаю с константой пи и это у меня такое вызывает вывих мозга
Переписывал с PropertyInfo и стало лень переименовывать :)