Wszystkie kolory do listy.

0

Witam wszystkich.
Piszę mały programik który ma za zadanie pobrać kolor i ustawić go jako np. color pen. Chcę użyć listy aby pobrać wszystkie kolory i później z nich korzystać. Niestety pętle na które natknąłem się w forach wyświetlają tylko kolory bez przeźroczystości a ja chciałbym zrobić coś w podobie do tego.

     List<Color> lista = new List<Color>();
        for (int a = 0; a < 255; a++)
        {
            for (int r = 0; r < 255; r++)
            {
                for (int g = 0; g < 255; g++)
                {
                    for (int b = 0; b < 255; b++)
                    {
                        lista.Add(Color.FromArgb(a, r, g, b));
                    }
                }
            }
        }

Niestety kod ten nie działa tak jak należy. Czy jest jakiś sposób na ulepszenie go bądź jakieś inne lepsze rozwiązanie ? Z góry dziękuje za pomoc.

2

Przede wszystkim ten kod dodaje Ci OBIEKT Color do listy. To, co chcesz uzyskać, to dodać reprezentację tego koloru do Itema np. ListBoxa. Albo innej kontrolki. To w zależności z czego korzystasz robi się inaczej. Używasz WPF, czy WinForms? A może UWP lub Xamarin?

Poza tym... 255 * 255 * 255 * 255 = 4 228 250 625. To znaczy, że będziesz miał tyle Itemów. Czy na pewno chcesz to osiągnąć? Po to służą kontrolki w stylu ControlPicker. To co chcesz zrobić nie jest normalne.

0

Używam WinForms. Zależy mi na wszystkich kolorach albo na przybliżonym zbiorze. Zastanawiam się czy nie ma jakiegoś szybkiego sposobu na pobranie go razem z kanałami alfa ?

0

Ale jaki efekt chcesz uzyskać? Bo malowanie ponad 4 miliardów itemów to... Załóżmy, że masz na tyle cierpliwości i na tyle szybkie procesory, że ogarną to i nie będziesz musiał konstruować jakiś fikołków. To jest to nawet nie do użycia dla użytkownika. Wyobrażasz sobie usera, który dopiero przy 3 miliardowym itemie mówi: "O! To jest ten kolor"?

0

Chcę wyświetlić te itemy choć z częściowym wyświetlaniem podczas przewijania .Myślałem że jest jakaś bibiloteka lub coś w ten deseń która mi pomoże. Tak jak BigIntiger (pewnie błąd w pisowni) który służy do operacji na naprawdę dużych liczbach. No ale cóż nie ma to nie ma pozostaje mi KnowColor i foreach. Póki co piszę to tylko dla siebie :)

0

Kuba ale jaki masz cel wyświetlania tych kolorów? Chcesz udowodnić, że się da dodać do listy miliony elementów? Jeżeli chcesz wybrać kolor, to użyj do tego gotowej kontrolki

0

Zastanawiają mnie 2 rzeczy. Pierwsza jak wyświetla się dużą liczbę pozycji np. stan w magazynach który może być w milionach a druga to kiedyś napisałem program który wyświetla liczby pierwsze w listboxie do maksymalnej wartości int'a i nie miałem jakoś z tym problemu gdyż ten listbox odświeżał się przy przewijaniu. Czy da się tak z kolorami ? A co do celu jest to mały program większego projektu coś na wzór painta w którym mam już listę kolorów ale bez przezroczystych.

2

To pewnie żart na prima aprilis ale odpowiem
W ogóle nie musisz generować tych kolorów - możesz je generować i wyświetlać na bieżąco na podstawie aktualnej pozycji w listboxie

Color.FromArgb(pozycja);

ListBox może być wirtualizowany - faktycznie będzie zawierał tylko tyle elementów ile się mieści na ekranie, ale suwak będzie miał rozmiar jakby miał 4 miliardy pozycji

Jeśli faktycznie chciałbyś je dodać wszystkie do listy (nie wiem po jaką cholerę) to zajmie to 16GB pamięci w RAMie - nigdy nie miałem nawet potrzeby użycia takiej ilości pamięci (jak już to poprzez bazę danych) - po pierwsze program musi być skompilowany na 64 bity żeby użyć więcej niż 4GB, po drugie pojedynczy obiekt nie może zdaje się zajmować więcej niż 2GB, musisz włączyć dodatkową flagę
https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element

Jak chcesz to tu masz więcej pomysłów jak uprzykrzyć użytkownikowi życie:
https://qz.com/679782/programmers-imagine-the-most-ridiculous-ways-to-input-a-phone-number/

0

Ok interesuje mnie opcja z pozycjami w listboxie. Mógłbyś jaśniej to opisać ? Jak je przypisać do kolorów skoro powszechne kolekcje nie zawierają wszystkich kolorów ? Próbowałem z Thread ale okno z kontrolką się wyświetla ale zawartość kontrolki już nie.

0

Normalnie wstawiasz ListView, ustawiasz VirtualMode na true i VirtualListSize na ilość wirtualnych elementów (u Ciebie 4294967296) i dodajesz kod do zdarzenia RetrieveVirtualItem

e.Item = new ListViewItem(Color.FromArgb(e.ItemIndex).ToString()) { BackColor = Color.FromArgb(e.ItemIndex) };

niestety z tego co widzę ListView nie obsługuje tak dużych wartości przewijania (max to 2147483647 ale nawet wtedy scroll bar nie działa) więc musisz sobie zrobić własną kontrolkę do tego.

Zaintrygowałeś mnie tym Thread - możesz rozwinąć jak go chciałeś tu użyć?
Dawno nie korzystałem z WinForms - może w WPF miałbyś więcej szczęścia

0

Ja robiłem to na listboxie ewentualnie combobox też mógłby być. Co do Thread to próbowałem coś takiego


 private void Metoda()
       {
           List<Color> lista = new List<Color>();
           for (int a1 = 0; a1 < 255; a1++)
           {
               for (int r1 = 0; r1 < 255; r1++)
               {
                   for (int g1 = 0; g1 < 255; g1++)
                   {
                       for (int b1 = 0; b1 < 255; b1++)
                       {
                           lista.Add(Color.FromArgb(a1, r1, g1, b1));
                     
                       }
                   }
               }
           }
     

       }
       private void Form2_Load(object sender, EventArgs e)
       {
           //    this.Invoke((MethodInvoker)(() => comboBox1.Items.Add(Color.FromArgb(a, r, g, b))));

           Thread th = new Thread(new ThreadStart(Metoda));
           th.Start();
       }

0

Będziesz miał exception przy dodawaniu elementu

0

@gswidwa1: Kiedyś napisałem program w WPF. Suwakiem wybierasz wartość red, green, blue a na ekranie wyświetla ci się kolor razem z nazwą koloru

0

@Zimny Krawiec: rozumiem, to nie jest trudne. Tylko mi chodzi o to, że autor zmienia w GUI właściwości z innego wątku

0

Temat wydaje mi się już do zamknięcia gdyż zrobiłem swego rodzaju picker z którego będę pobierał dany kolor

?!GIF.gif

0

Temat wydaje mi się już do zamknięcia gdyż zrobiłem swego rodzaju picker (podany w gifie) z którego będę pobierał dany kolor
co do listy podanej przez Zimnego krawca to nie jest ta sama lista co w


List listOfMediaColours = new List();
foreach(KnownColor color in Enum.GetValues(typeof(KnownColor)))
{
    System.Drawing.Color col = System.Drawing.Color.FromKnownColor(color);
    listOfMediaColours.Add(System.Windows.Media.Color.FromArgb(col.A, col.R, col.G, col.B));
}

?!GIF.gif

0

Ale wiesz, że istnieje już taka kontrolka nawet z wyborem poziomu przezroczystości?

0

Mógłbyś coś więcej o niej powiedzieć bo jej nie kojarzę.

1

Polecam też mały projekt który pomaga wejść w WPF:
W książce jako "zadanie własne" jest osadzenie za suwakami pól tekstowych które maja wyświetlać ustawione wartości tych suwaków. Pomocna rzecz jeżeli potrzebujesz kolor ustawiać na podstawie "cyferek" i potrzebujesz szybkiego podglądu.

1

Na początku używałem ColorDialog ale nie była po mojej myśli przynajmniej w tym projekcie. Dlatego zrobiłem coś na wzór tego co pokazał Varran.

1 użytkowników online, w tym zalogowanych: 0, gości: 1