purebasic.info

PureBasic forum
Текущее время: Пн сен 16, 2019 1:47 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Нарисовать линию со сглаживанием
СообщениеДобавлено: Чт сен 05, 2019 11:21 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 882
Благодарил (а): 95 раз.
Поблагодарили: 26 раз.
Пункты репутации: 5
в 2D рисуется просто ломаная линия, это не годится
в векторе на канвасе есть сглаживание и оно вроде нормально работает, но нужна прозрачность
создаём картинку с прозрачностью и получаем фигню
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
If OpenWindow(0, 0, 0, 400, 200, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 0, 0, 200, 200)
ImageGadget(11, 200, 0, 200, 200, 0)
    If StartVectorDrawing(CanvasVectorOutput(0))
      MovePathCursor(40, 20)
        AddPathLine(90, 30, #PB_Path_Relative)
      VectorSourceColor(RGBA(255, 0, 0, 255))
      StrokePath(1)
      StopVectorDrawing()
    EndIf
 
If CreateImage(22, 256, 256, 32, #PB_Image_Transparent)
If StartVectorDrawing(ImageVectorOutput(22))
MovePathCursor(40, 20)
AddPathLine(90, 30, #PB_Path_Relative)
VectorSourceColor(RGBA(255, 0, 0, 255))
StrokePath(1)
StopVectorDrawing()
SetGadgetState(11, ImageID(22))
EndIf
EndIf
 
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf


скрин, увеличено в 7 раз
Изображение

верхняя линия это канвас, вроде всё нормально

средняя это картинка с прозрачностью, как видно линия не красная, а коричневая, хорошо видны полупрозрачные пиксели не имеющие отношения к красному цвету, этот цвет похож на чёрный который является фоном по умолчанию
получется что полупрозрачность замешивается с чёрным фоном, а не с цветом линии, неправильно здесь идёт замес
попытки перекрасить фон имеют нулевой эффект
Код:
1
2
3
VectorSourceColor(RGBA(255, 0, 0, 0))
FillVectorOutput()
FillPath()


может я что то упускаю в векторе, и таки можно нарисовать правильно?

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


кончилась у меня фантазия :oops:


Вложения:
Буфер обмена02.png [9.22 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт сен 06, 2019 4:43 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 882
Благодарил (а): 95 раз.
Поблагодарили: 26 раз.
Пункты репутации: 5
чтобы получилось правильно нужно фон залить тем же цветом которым будем рисовать, только заливать нужно в 2D, в векторе этот фокус непроходит
если залить белым, то вроде получается универсально, другие цвета нормально замешиваются,
хотя с белым фоном есть небольшое расхождение в цвете, но где то на это можно забить,
полупрозрачные цвета получаются немного нечистые, к ним подмешивается белый цвет фона
так же незабываем, что это таки костыль, где то может обломаться более серьёзно

пока непроверял как всё это будет сохраняться в пнг файл и падать в буфер
если что то пойдёт не так, то напрашивается такая идея, создать ещё одну картинку, на неё положить нарисованное, а дальше понятно
время покажет что получится

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
If CreateImage(22, 256, 256, 32, #PB_Image_Transparent); создаём прозрачную картинку
 
StartDrawing(ImageOutput(22)); создаём прозрачный фон с нужным цветом
DrawingMode(#PB_2DDrawing_AllChannels)
Box(0, 0, 256, 256, $00ffffff)
StopDrawing()
 
If StartVectorDrawing(ImageVectorOutput(22)); теперь вектор рисует правильную линию
MovePathCursor(40, 20)
AddPathLine(90, 30, #PB_Path_Relative)
VectorSourceColor(RGBA(255, 0,0, 255))
StrokePath(1)
StopVectorDrawing()
SetGadgetState(11, ImageID(22))
EndIf
EndIf



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пт сен 06, 2019 6:51 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 890
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Читал тут давеча это...
При установленном WS_EX_COMPOSITED все потомки окна получают порядок рисования снизу вверх с использованием двойной буферизации. Порядок отрисовки снизу вверх позволяет исходному окну иметь эффекты полупрозрачности (альфа) и прозрачности (цветовой ключ), но только если в дочернем окне также установлен бит WS_EX_TRANSPARENT. Двойная буферизация позволяет окну и его потомкам быть нарисованными без мерцания.
Вот у вас указан TRANSPARENT,может и этот WS_EX_COMPOSITED нужен? :roll:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Сб сен 07, 2019 5:41 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 882
Благодарил (а): 95 раз.
Поблагодарили: 26 раз.
Пункты репутации: 5
да вроде всё работает, вчера получилось всё правильно нарисовать в виде иконки 32х32, теперь можно в основной код переносить

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB