Сегодня мой первый рабочий день в городе. И я начал его с установки программ Autodesk 3ds max и MatLab. Возможно, в дальнейшем, мне эти программы пригодятся. Ну а пока же большую часть времени я посвящаю разработке своей программы для организации и автоматизации баз данных на SQLite. И вот сегодня я начал создавать контрол под названием ColorPicker. Я уже не один год как собирался начать делать этот элемент интерфейса. Только тогда, годы назад, я хотел было делать его на языке jаvascript. Но потом ветер переменился и я перешел на язык программирования C# и верстку дизайна на WPF а теперь и на Avalonia, что очень похоже на WPF XAML, но отличается рядом удобных фишек и кроссплатформенностью. Сделать этот элемент в целом не сложно, но всё-таки я столкнулся с одной маленькой, но весьма весомой сложностью, не решив которую теряется весь смысл создания этого контрола.
Сложность заключается в получении цвета пикселя на выбранной под курсором области экрана. Нужно получить доступ к пиксельному цветовому контенту изображения, получить цвет и присвоить полученное значение в свойство ColorPicker-а. Вот тут всё обстоит непросто. Первую половину дня, до трёх часов я экспериментировал и тыкался в поисках способа сделать это. И вот есть два альтернативных варианта. Один вариант отличается простотой реализации но, к сожалению, отсутствием кроссплатформенной реализации. Это будет работать на Windows, но для других платформ выйдет облом. А ведь моя программа - кроссплатформенная, значит и функционал должен быть кроссплатформенным.
Другой вариант будет реализовать посложнее, но там, как я понимаю, есть кроссплатформенность. Получить значение цвета пикселя изображения там позволяет класс Avalonia.Controls.Skia - SKBitmap. Этот класс имеет методы для установки и получения цветового значения пикселей изображения. И практически это всё. В данном классе не реализован функционал по рисованию фигур и градиентов (особенно, что важно, - градиентов) и всё приходится вырисовывать попиксельно, через метод SetPixel. И самое главное обидное то, что невозможно получить значение пикселя у стандартного в авалонии класса Bitmap. То есть мне придется проделать такую работу: с помощью другого языка программирования (!) вытащить из заранее заготовленной картинки массив всех пикселей данного изображения, затем сохранить этот массив и напрямую вставить его в класс C#. Получается довольно костыльно и не удобно, а что делать? Другого способа я пока не нашел. Может он и есть, я не исключаю, но до него я еще не добрался. Попробую завтра сначала этот второй способ. Придется градиент цветовой области палитры рисовать вручную, попиксельно. А градиент цветового диапазона придется извлекать из картинки (так как это сложный градиент, его долго по времени придется просчитывать) с помощью языка jаvascript и HTML-элемента Canvas! Здравствуй, jаvascript! После долгого перерыва мне по долгу службы придется к нему вернуться!
Ну а пока это всё. Вот на скриншоте текущий вид палитры выбора цвета. Тут ещё много работать. Надеюсь завтра закончу. Хочется надеется, что с получением цвета пикселя всё получится. Было бы очень обидно отказываться от этого контрола. Так что этот вопрос мне нужно решить. Ну а пока до завтра.
