Задать вопрос
mk3mk
@mk3mk
занимаюсь вёрсткой (иногда)

Макрос в Coreldraw Для создания эффекта Halftone?

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

И вроде бы рисует кружочки, но еще
нужно реализовать реальную логику получения яркости пикселя в CorelDRAW.

вот код
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 cir As Shape
    Dim shp As Shape ' Переменная для перебора фигур
    
    ' Переменные для вычисления объединённых границ
    Dim leftBoundary As Double, topBoundary As Double
    Dim rightBoundary As Double, bottomBoundary As Double
    Dim curLeft As Double, curTop As Double, curRight As Double, curBottom As Double
    Dim firstShapeProcessed As Boolean

    Dim lyr As Layer ' Переменная для перебора слоев

    Set doc = ActiveDocument

    ' Поиск слоя Background на активной странице
    Set bgLayer = Nothing
    For Each lyr In ActivePage.Layers
        If lyr.Name = "Background" Then
            Set bgLayer = lyr
            Exit For
        End If
    Next lyr
    If bgLayer Is Nothing Then
        MsgBox "Слой 'Background' не найден!", vbExclamation
        Exit Sub
    End If

    ' Поиск слоя Circles на активной странице
    Set circlesLayer = Nothing
    For Each lyr In ActivePage.Layers
        If lyr.Name = "Circles" Then
            Set circlesLayer = lyr
            Exit For
        End If
    Next lyr
    If circlesLayer Is Nothing Then
        MsgBox "Слой 'Circles' не найден!", vbExclamation
        Exit Sub
    End If

    ' Удаляем все объекты на слое Circles
    circlesLayer.Shapes.All.Delete

    ' Проверяем, есть ли фигуры на слое Background
    If bgLayer.Shapes.Count = 0 Then
        MsgBox "На слое Background нет фигур. Нечего анализировать.", vbExclamation
        Exit Sub
    End If

    ' Инициализируем флаг для первой фигуры
    firstShapeProcessed = False

    ' Вычисляем объединённые границы всех фигур на слое Background вручную
    For Each shp In bgLayer.Shapes
        ' Получаем границы текущей фигуры
        shp.GetBoundingBox curLeft, curTop, curRight, curBottom

        If Not firstShapeProcessed Then
            ' Для первой фигуры просто присваиваем значения
            leftBoundary = curLeft
            topBoundary = curTop
            rightBoundary = curRight
            bottomBoundary = curBottom
            firstShapeProcessed = True
        Else
            ' Для последующих фигур обновляем границы
            If curLeft < leftBoundary Then leftBoundary = curLeft
            If curTop < topBoundary Then topBoundary = curTop
            If curRight > rightBoundary Then rightBoundary = curRight
            If curBottom > bottomBoundary Then bottomBoundary = curBottom
        End If
    Next shp

    ' Проходим по области с шагом stepSize, используя вычисленные границы
    For y = topBoundary To bottomBoundary Step stepSize
        For x = leftBoundary To rightBoundary Step stepSize
            ' Анализ яркости под точкой (x, y)
            brightness = GetBrightnessAtPoint(x, y, bgLayer)
            ' Вычисляем диаметр кружочка
            diameter = minDiameter + (maxDiameter - minDiameter) * brightness
            ' Создаём кружок на слое Circles
            Set cir = circlesLayer.CreateEllipse2(x, y, diameter / 2, diameter / 2)
            cir.Fill.UniformColor.RGBAssign 128, 128, 128 ' Серый цвет
            cir.Outline.SetNoOutline
        Next x
    Next y
End Sub

Function GetBrightnessAtPoint(x As Double, y As Double, layer As Layer) As Double
    ' !!! ВНИМАНИЕ: Это заглушка. Здесь нужно реализовать реальную логику
    ' !!! получения яркости пикселя в CorelDRAW.
    ' !!! Это может потребовать экспорта части изображения во временный Bitmap
    ' !!! и анализа пикселей через External API или другие методы.
    ' Возвращаем среднюю яркость для примера
    GetBrightnessAtPoint = 0.5
End Function

Корел 2024
  • Вопрос задан
  • 2356 просмотров
Подписаться 4 Простой 5 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы