11
votes

Construire une classe de gris griscale

Récemment, je suis tombé sur un graphique de couleur .NET basé sur la valeur de leur teinte et de leur luminosité. Quel trait moi est le graphique de niveaux de gris. Par exemple, Darkgray est en fait plus léger puis gris? De plus, je ne peux voir aucune logique dans la gradation des valeurs RVB, il passe de 0 à 105 à 128?

public sealed class GrayScaleBrushes
{
    private static SolidBrush pct05 = null;

    public static SolidBrush Pct05
    {
        get
        {
            if (pct05 == null)
            {
                int rgbVal = GetRgbValFromPct( 5 );
                pct05 = new SolidBrush(Color.FromArgb(rgbVal, rgbVal, rgbVal));
            }
            return pct05;
        }
    }

    private static int GetRgbValFromPct(int pct)
    {
        return 255 - (int)(((float)pct / 100f) * 255f);
    }
}


1 commentaires

Pour la raison Darkgray> Grey , voir Wikipedia: EN.Wikipedia .org / wiki / ...


3 Réponses :


1
votes

Les brosses Les classes sont statiques ne peuvent que fuir un petit nombre de ressources correspondant au nombre de couleurs définies afin que ces ressources soient nettoyées lors de la sortie de l'application. Nous vous préoccupez plutôt de veiller à ce que vos pinceaux ne soient pas réellement créés, à moins qu'ils ne soient référencés. Cela accélérera le démarrage et assurera que les couleurs inutilisées ne consomment pas de ressources.


0 commentaires

1
votes

Le SafeNativemethods est dans ce cas simplement un cache simple qui contient une copie de la brosse. Donc, un deuxième appel à la propriété Getter ne créera pas une nouvelle instance. Au lieu de cela, il retournera toujours le même pinceau.

Pour accomplir cela, vous pouvez réécrire votre fonction peut-être comme ceci: xxx

Cette solution créera les échelles de gris au besoin, mais par les coûts de la vérification du null chaque fois qu'il est appelé. Vous pouvez accomplir ce problème vitesse en le modifiant à nouveau un problème de mémoire en prenant une approche comme ceci: xxx

mais Je pense que dans ce cas, il suffit d'une question de goût, de caustes ni de la vitesse ni de la mémoire ne sera un vrai problème dans les deux cas.


0 commentaires

1
votes

Je recommanderais ce qui suit:

Créer une classe statique grisalcalebrushes

créer un dictionnaire statique avec le pourcentage d'intensité (int) comme clé,

Créer une seule propriété Static Indexé 'PCT' que vous utiliseriez comme grisscalebrushes.pct [10] qui retournerait l'entrée du dictionnaire.

Maintenant, vous pourriez soit faire comme Oliver a dit et crée les entrées de dictionnaire à la volée telle qu'elles sont appelées, ou vous pouvez utiliser un constructeur statique pour boucler les 20 entrées et les ajouter au dictionnaire.

Cette méthode WOUD vous permet de créer et de conserver les 20 propriétés impaires. Bravo.


0 commentaires