Форум программистов, компьютерный форум, киберфорум
QML
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 0
Регистрация: 24.02.2017
Сообщений: 130
1

Нарисовать рамку вокруг картинки с использованием ShaderEffect

15.09.2022, 16:12. Показов 465. Ответов 0
Метки c++, qml, qt5 (Все метки)

Author24 — интернет-сервис помощи студентам
Есть картинка, которая округляется с помощью
C++
1
ShaderEffect
:

C++
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
27
28
29
30
31
32
33
34
35
Image {
                   id: image
                   property bool rounded: false
                   property bool adapt: true
                   anchors.fill: parent
                   fillMode: Image.PreserveAspectFit
                   source: ""
                   mirror: true
                   layer.enabled: rounded
                   layer.effect: ShaderEffect {
                       property real adjustX: image.adapt ? Math.max(width / height, 1) : 1
                       property real adjustY: image.adapt ? Math.max(1 / (width / height), 1) : 1
 
                       fragmentShader: "
                       #ifdef GL_ES
                           precision lowp float;
                       #endif // GL_ES
                       varying highp vec2 qt_TexCoord0;
                       uniform highp float qt_Opacity;
                       uniform lowp sampler2D source;
                       uniform lowp float adjustX;
                       uniform lowp float adjustY;
 
                       void main(void) {
                           lowp float x, y;
                           x = (qt_TexCoord0.x - 0.5) * adjustX;
                           y = (qt_TexCoord0.y - 0.5) * adjustY;
                           float delta = adjustX != 1.0 ? fwidth(y) / 2.0 : fwidth(x) / 2.0;
                           gl_FragColor = texture2D(source, qt_TexCoord0).rgba
                               * step(x * x + y * y, 0.25)
                               * smoothstep((x * x + y * y) , 0.25 + delta, 0.25)
                               * qt_Opacity;
                       }"
                   }
               }
Необходимо добавить ей рамку в 3 пикселя (вокруг скругленной картинки). Пытаюсь сделать квадрат сверху картинки с бордером:

C++
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
    
Rectangle {
                   id: shaderEffectContainer
 
                   width: image.width; height: width;
                   anchors.centerIn: image
 
                   color: "transparent"
 
                   Rectangle {
                       id: rectangleSource
 
                       anchors.fill: parent
 
                       ShaderEffectSource {
                           id: source
 
                           sourceItem: image
                           visible: false
                       }
 
                       ShaderEffect {
                           anchors.fill: parent
 
                           property variant source: source
 
                           vertexShader: "
                               uniform highp mat4 qt_Matrix;
                               attribute highp vec4 qt_Vertex;
                               attribute highp vec2 qt_MultiTexCoord0;
                               varying highp vec2 qt_TexCoord0;
                               void main() {
                                   qt_TexCoord0 = qt_MultiTexCoord0 * 1.5 * vec2(0.5, 0.5);
                                   gl_Position = qt_Matrix * qt_Vertex;
                               }"
 
                           fragmentShader: "
                               varying highp vec2 qt_TexCoord0;
                               uniform sampler2D source;
                               uniform lowp float qt_Opacity;
                               void main() {
                                   gl_FragColor = texture2D(source, qt_TexCoord0) * qt_Opacity;
                               }"
                       }
                       visible: false
                       layer.enabled: image.rounded
                   }
 
                   Rectangle {
                       id: maskLayer
                       anchors.fill: parent
                       border.width: 3
                       radius: parent.width / 2
 
                       color: "transparent"
 
                       border.color: "green"
 
                       layer.enabled: image.rounded
                       layer.samplerName: "maskSource"
                       layer.effect: ShaderEffect {
 
                           property var colorSource: rectangleSource
                           fragmentShader: "
                               uniform lowp sampler2D colorSource;
                               uniform lowp sampler2D maskSource;
                               uniform lowp float qt_Opacity;
                               varying highp vec2 qt_TexCoord0;
                               void main() {
                                   gl_FragColor =
                                       texture2D(colorSource, qt_TexCoord0)
                                       * texture2D(maskSource, qt_TexCoord0).a
                                       * qt_Opacity;
                               }"
                       }
                   }
               }
До скругления рамка есть. После пропадает. Возможно есть способы проще и эффективнее сделать это, нежели накладывать поверх картинки квадрат?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2022, 16:12
Ответы с готовыми решениями:

Нарисовать рамку вокруг текста
Добрый день! У меня тут назрел вопрос... Как можно сделать с помощью библиотеки Graphics.h...

Нарисовать рамку вокруг текста
Вывести на экран монитора горизонтальная строка текста длиной не более двадцати символов...

Нарисовать рамку вокруг чужого окна
Во всяких программах для захвата экрана (или в Spy++ ещё) вокруг выбранного окна рисуется рамка,...

Как нарисовать рамку из пикселей случайного цвета вокруг bmp изображения?
подробнее, вместе с прикрепленным проектом https://www.cyberforum.ru/cpp-builder/thread2391886.html

0
15.09.2022, 16:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.09.2022, 16:12
Помогаю со студенческими работами здесь

Подскажите как сделать рамку черную в один пиксель вокруг картинки
Сабж. Вот такая задача стоит. Есть картинка. Надо чтобы скрипт делал вокруг нее черную каемку.

Почему рамка создаётся вокруг картинки, а не вокруг блока?
Не подскажите ещё кое-что? Не хочу засорять тему HTML/CSS своими простецкими вопросами. Почему у...

Удалить рамку вокруг JLabel
Доброго времени суток, нарисовал JLabel, сделал ему рамку вот так...

Убрать рамку вокруг окна
Как убрать рамку вокруг окна? Там, где кнопочки закрыть и тд?

Создать пунктирную рамку вокруг элемента
Господа, скажите пожалуйста как можно сделать пунктирную рамку вокруг ячейки грида? Пробую вот...

Добавить рамку вокруг виджета карты
Добрый день. Как добавить рамку вокруг виджета карты чтобы он не сливался с основной картой?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru