Canvas - это круто! - страница 88

 
Vitaliy Kuznetsov #:

Ещё заметил ошибку

Эта картинка вызвала ошибку. Это точно PNG, но у неё в данных нет DPI

//upd. В некоторых тоже нет PDI данных, но они работают

Как я уже писал, что алгоритм декомпрессии PNG был разработан не мной, я Zorro 7 лет назад. Точнее он, наверное, его портировал из какого-нибудсь C++ кода. Более того, этот код всегда выдавал ошибку, и я просто обошел эту ошибку, просто игнорируя её, после чего декомпрессия заработала. Поэтому могут быть косяки. Я не разбирался в спецификации формата PNG и его версий. Возможно нужно более детально погрузиться в этот формат или формат jpg. 

Тем более этот png файл кривой какой-то с квадратиками без прозрачности с 8-битной цветовой маской вместо 24-битной. 

 
Renat Akhtyamov #:

С такими навыками графического отображения можно панельки писать свои на переключение и настройку индикаторов....

типа такого

предполагаю что на ура в маркете уйдет

поэтому я и сделал пример с парсингом и масштабированием иконок на прозрачном фоне.


 
Nikolai Semko #:

Как я уже писал, что алгоритм декомпрессии PNG был разработан не мной, я Zorro 7 лет назад. Точнее он, наверное, его портировал из какого-нибудсь C++ кода. Более того, этот код всегда выдавал ошибку, и я просто обошел эту ошибку, просто игнорируя её, после чего декомпрессия заработала. Поэтому могут быть косяки. Я не разбирался в спецификации формата PNG и его версий. Возможно нужно более детально погрузиться в этот формат или формат jpg. 

Тем более этот png файл кривой какой-то с квадратиками без прозрачности с 8-битной цветовой маской вместо 24-битной. 

Nikolai Semko #:

Я попробовал. Заметил квадраты только в случае ресайза. Поэтому, наверное мой алгоритм ресайза не совершенен. Уже писал как-то, что этот алгоритм был создан на скорую руку буквально за полдня весьма давно. Сейчас бы я сделал этот алгоритм совсем по другому. Но, к сожалению, пока времени нет.

Сам пониманию, что написать код на 3+ это день, а на 5+ это месяц. А если проект большой, то сроки могут быть в ещё больших диапазонах.

На том, что есть, Спасибо. Этого пока хватит.

 

Есть ли в канвасе способ заливки экрана круговым градиентом из центра?

Тут был пример вертикального градиента - https://www.mql5.com/ru/code/31689

 
Vitaliy Kuznetsov #:

Есть ли в канвасе способ заливки экрана круговым градиентом из центра?

Тут был пример вертикального градиента - https://www.mql5.com/ru/code/31689

это легко сделать.
нужна только одна формула:

R2 = X2+Y2

по-моему даже функцию приводил

 
Vitaliy Kuznetsov #:

Есть ли в канвасе способ заливки экрана круговым градиентом из центра?

Тут был пример вертикального градиента - https://www.mql5.com/ru/code/31689

можно использовать такой вариант:

void iCanvas::RadiusGrad(double x, double y, double r, uint clr_center, uint clr_end){
   int x_left = Floor(x-r);
   int x_right = Ceil(x+r);
   int y_top = Floor(y-r);
   int y_bottom = Ceil(y+r);
   double r2=r*r;
   if (x_left<0) x_left = 0;
   if (x_left>=m_width) return;
   if (x_right>m_width) x_right = m_width;
   if (x_right<0) return;
   
   if (y_top<0) y_top = 0;
   if (y_top>=m_height) return;
   if (y_bottom>m_height) y_bottom = m_height;
   if (y_bottom<0) return;
   
   argb c1,c2, c;
   c1.clr =clr_center;
   c2.clr =clr_end;
   
   for(int i_y=y_top;i_y<y_bottom;i_y++) {
      for(int i_x=x_left;i_x<x_right;i_x++) {
         int adr = i_y*m_width+i_x;
         double r1 = (i_x-x)*(i_x-x)+(i_y-y)*(i_y-y);
         if (r1<=r2) {
            double k = sqrt(r1)/r;
            for (int i=0;i<4;i++) c.c[i] = uchar(c1.c[i] + k*((int)c2.c[i]-c1.c[i]));
            MixColor(c.clr,m_pixels[adr]);
         }
      }
   }
}
градиент идет также по альфа-каналу(по прозрачности)
Файлы:
 
Nikolai Semko #:

можно использовать такой вариант:

градиент идет также по альфа-каналу(по прозрачности)

Спасибо, попробую.

 

Николай, привет!

Как то я просил ползунки забацать, чтобы было удобно выбирать период просмотра графика

Я имел ввиду такое:


очень удобно!
 
Renat Akhtyamov #:

Николай, привет!

Как то я просил ползунки забацать, чтобы было удобно выбирать период просмотра графика

Я имел ввиду такое:


очень удобно!
Во-первых, не очень удобно (ИМХО)
Во-вторых, подобные реализации требуют много времени
 
Nikolai Semko #:
Во-первых, не очень удобно (ИМХО)
Дело в том, что при реализации подобного неизбежно столкнетесь с катастрофической нехваткой длины слайдера. 
Как правило подобное реализуют в одном слайдере, а не в одном, ширину кнопки которого можно менять, перетаскивая за её края, меняя таким образом масштаб. Но и такой подход не решает проблему длины слайдера, хотя такой подход более удобный. 
Причина обращения: