Всем привет!
Мне нужно создать Макрос в Coreldraw Для создания эффекта Halftone.
Чтобы я мог задавать максимальный и минимальный диаметр кружочков, их шаг и направление, например, квадратное, или под углом 60 градусов и т.д.
И чтобы на выходе я мог это сохранить в вектор. Например в DFX, SVG и т.д.
Исходное изображение может быть как растровым, так и векторным.
В конечном итоге должна получиться перфорация из кружочков разного размера.

И я написал вот немного кода, с помощью которого создается массив кружочков, потом каждый кружок проверяет цвет фона, на котором он расположен и в зависимости от интенсивности цвета он меняет свой размер.
Возникает ошибка
Compile error Syntax error в строке
Dim circle As Shape
Хотя библиотека CorelDRAW Object Library подключена, вот код
Sub CreateCirclesByBrightness()
Dim minDiameter As Double: minDiameter = 5
Dim maxDiameter As Double: maxDiameter = 15
Dim stepSize As Double: stepSize = 20
Dim circlesLayer As layer
Dim bgLayer As layer
Dim doc As Document
Dim x As Double, y As Double
Dim brightness As Double
Dim diameter As Double
Dim circle As Shape 'тут возникает ошибка
Dim bounds As Rect
Set doc = ActiveDocument
Set bgLayer = doc.Layers("Background")
' Удаляем или создаём слой Circles
On Error Resume Next
Set circlesLayer = doc.Layers("Circles")
If Not circlesLayer Is Nothing Then
circlesLayer.Shapes.All.Delete
Else
Set circlesLayer = doc.Layers.Add("Circles")
End If
On Error GoTo 0
' Получаем границы векторного изображения на слое Background
bounds = bgLayer.Shapes.All.CreateSelectionRange.BoundingBox
' Цикл по координатам с шагом stepSize
For y = bounds.Top To bounds.Bottom Step stepSize
For x = bounds.Left To bounds.Right Step stepSize
' Анализ яркости под точкой (x, y)
brightness = GetBrightnessAtPoint(x, y, bgLayer)
' Интерполяция диаметра
diameter = minDiameter + (maxDiameter - minDiameter) * brightness
' Создаём кружок
Set circle = circlesLayer.CreateEllipse2(x, y, diameter / 2, diameter / 2)
circle.Fill.UniformColor.RGBAssign 128, 128, 128 ' Серый цвет, например
circle.Outline.SetNoOutline
Next x
Next y
End Sub
Function GetBrightnessAtPoint(x As Double, y As Double, layer As layer) As Double
' Здесь реализуйте получение яркости в точке (x, y)
' Возвращайте значение от 0 (черный) до 1 (белый)
' Можно использовать экспорт в Bitmap и анализ пикселей, либо API CorelDRAW
' Заглушка:
GetBrightnessAtPoint = 0.5
End Function
Корел 2024