Перенос и поворот картинки в графическом редакторе

  Продолжаю рассказывать о графическом редакторе для рисования и обработки изображений.
  Первая статья по этой теме тут - http://www.proza.ru/2019/06/04/1410 
  Сейчас расскажу о тех средствах копирования, которые я сделал.
  Я не стал повторять то, что можно сделать в стандартной программе Paint, однако кое-что добавил, и кое-что упростил.

  Область для копирования я выделяю без построения рамочки, а просто кликаю по точкам её диагональные углы. Затем кликаю на кнопке "Copy". Кнопочка окрашивается в розовый цвет - это значит, что координаты моих кликов компьютер помнит.
  Затем показываю какую точку и куда перенести, кликая по ним. Причём вовсе не обязательно, чтобы первая точка находилась в выделенной области. Берём ту точку, которая удобнее.
  Прежде чем нажать на кнопку "Paste" можно в поле над ней ввести угол поворота и опцию копирования - буква "п" будет означать прозрачность фона в выделенной области, заглавная буква "П" добавит первоначальное отражение выделенной области Право-налево, а буква "g" будет означать градиентное копирование (без поворота).
  Обозначив первую и вторую точки для переноса, кликаем кнопку "Paste". После того, как копирование выполнено, кнопка окрашивается розовым - это значит, что координаты первой точки компьютер запомнил, и следующие копии можно делать проще - используя клавишу "Q" (см. ниже ).

  Результат работы копирования вы можете видеть на иллюстрации.
  Для лепесточка показаны крестиками точки выделения области, красной стрелочкой - направление и величина переноса изображения. Как можно видеть, лепесточек при копировании повернулся на заданный угол 30 градусов вокруг второй, указанной для переноса, точки.

  Чтобы составить из лепесточков цветочек, вовсе не обязательно каждый раз кликать, указывая точки переноса изображения и вводить другие цифры, чтобы угол поворота изменился. Нужно просто оставить стрелочку-указатель мыши на центре будущего цветочка и нажать на клавиатуре "Q". Лепесточек будет скопирован.
  Потом ничего не трогаем, а только нажимаем клавишу "<" или ">", изменяя значение угла поворота на шаг, указанный на кнопочке "Градация" в верхней части экрана, а затем вновь нажимаем клавишу "Q". И продолжаем этот процесс, пока не заполним розетку цветка лепестками.
  Затем перекрашиваем лепесток, указываем первой точкой для копирования место, более близкое к основанию лепестка, кликаем на центре розетки и оставляем указатель мыши на этом центре. Продолжая нажимать на клавиши "Q", "<" или ">", делаем второй ряд лепестков в розетке.

  В нижней части иллюстрации показан результат градиентного копирования, то есть копирования с постепенным переходом между изображением и его фоном. Справа - результат однократного копирования со слабым градиентом. В центре - результат многократного копирования с этим же градиентом в одну и ту же точку. Для многократного копирования использовалась клавиша "Q".

  Ещё одна опция - "G" (мнемонически обозначающая уже не градиент, а glue - клей) позволяет копировать выбранную область на однотонную область. Цвет однотонной области, на который будет "прилипать" изображение,  кликается правой кнопкой мыши и тем самым выбирается как активный. Потом, многократно нажимая клавишу "Q", однотонную область можно заполнять, придавая ей, например, фактуру моей рубашки. Другие цвета при этом не меняются.
______
  Программа, которую я делаю, уже достаточно хороша для практического использования. Скачать её можно по этому адресу - http://yadi.sk/d/bd3PVYUko3qdEA
Скачайте и попробуйте. Мне будут интересны Ваши замечания.
В программе нет возможности чертить графические примитивы, такие, как круг, или печатать текст. Поэтому, для полного счастья её хорошо использовать в паре с обычным Paint.
_____________
       Продолжение тут - http://www.proza.ru/2019/06/09/1363


===================
ПРИЛОЖЕНИЕ - тексты подпрограмм для переноса и поворота изображения

Public Sub RPaste(M As Integer) 'копирование
   Dim Co As Long, I As Integer, J As Integer, DX As Integer, DY As Integer
   Dim Io As Integer, Im As Integer, Jo As Integer, Jm As Integer, ZZ As Integer, Ct As Long
  Form1.Picture1.DrawWidth = 1: Ct = -1: If M > 0 Then Ct = cBack
  Io = XX2: Im = XX1: If Io > Im Then Im = XX2: Io = XX1
  Jo = YY2: Jm = YY1: If Jo > Jm Then Jm = YY2: Jo = YY1
  DX = OldX1 - cX: DY = OldY1 - cY: If M = 2 Then DX = DX + 2 * cX - Im - Io 'Право-лево
  For I = Io To Im: For J = Jo To Jm
    ZZ = I: If M = 2 Then ZZ = Io + Im - ZZ - 1 'xxxx
    Co = Form1.Picture1.Point(ZZ, J):
    If Co <> Ct Then Form1.Picture1.PSet (I + DX, J + DY), Co
  Next J, I
End Sub

Public Sub R1Paste(M As Integer, U As Double) 'копирование с поворотом
Dim Co As Long, I As Integer, J As Integer, DX As Integer, DY As Integer
Dim Io As Integer, Im As Integer, Jo As Integer, Jm As Integer, ZZ As Integer, Ct As Long
Dim X As Single, X1 As Integer, Y As Single, Y1 As Integer, CU As Single, SU As Single
  Form1.Picture1.DrawWidth = 2: Ct = -1: If M > 0 Then Ct = cBack
  CU = Cos(U * 0.01745329): SU = Sin(U * 0.01745329)
  Io = XX2: Im = XX1: If Io > Im Then Im = XX2: Io = XX1
  Jo = YY2: Jm = YY1: If Jo > Jm Then Jm = YY2: Jo = YY1
   DX = OldX1 - cX: DY = OldY1 - cY: If M = 2 Then DX = DX + 2 * cX - Im - Io 'Право-лево
  For I = Io To Im: For J = Jo To Jm
    ZZ = I: If M = 2 Then ZZ = Io + Im - ZZ - 1 'xxxx
    Co = Form1.Picture1.Point(ZZ, J) 'xxxx
    X = I + DX - OldX1: Y = J + DY - OldY1: X1 = Int(CU * X - SU * Y): Y1 = Int(CU * Y + SU * X)
    If Co <> Ct Then Form1.Picture1.PSet (X1 + OldX1, Y1 + OldY1), Co
  Next J, I
End Sub

Public Sub R2Paste(M As Integer) 'копирование c градиентом
   Dim Co As Long, I As Integer, J As Integer, DX As Integer, DY As Integer
   Dim Io As Integer, Im As Integer, Jo As Integer, Jm As Integer, JJ As Integer, Ct As Long
   Dim G As Single, L As Single, A1 As Single, A2 As Single, A3 As Single, A4 As Single
  Form1.Picture1.DrawWidth = 1: G = 10 * (CV + 1): G = 1 / G
  Io = XX2: Im = XX1: If Io > Im Then Im = XX2: Io = XX1
  Jo = YY2: Jm = YY1: If Jo > Jm Then Jm = YY2: Jo = YY1
  DX = OldX1 - cX: DY = OldY1 - cY: If M = 2 Then DY = DY + 2 * cY - Jm - Jo
  For I = Io To Im: For J = Jo To Jm
    JJ = J: If M = 2 Then JJ = Jo + Jm - JJ - 1 'xxxx
    Co = Form1.Picture1.Point(I, JJ): Ct = Form1.Picture1.Point(I + DX, J + DY)
    A1 = I - Io: A2 = Im - I: A3 = J - Jo: A4 = Jm - J
    A1 = A1 * G: If A1 > 1 Then A1 = 1
    A2 = A2 * G: If A2 > 1 Then A2 = 1
    A3 = A3 * G: If A3 > 1 Then A3 = 1
    A4 = A4 * G: If A4 > 1 Then A4 = 1
    L = A1 * A2 * A3 * A4: Co = ccRGB(Co, Ct, L)
    Form1.Picture1.PSet (I + DX, J + DY), Co
  Next J, I
End Sub

'========================


Рецензии
Уважаемый, Дмитрий!
У Вас действительно фонтан идей. Как увидел из мимолётного знакомства: графическое редактирование, музыкальное синтезирование. Думаю увлечения на этом не заканчиваются.
У меня тоже есть желание учиться и работать с графическим редактором чуть более лучше, чем любитель, но пока со временем никак не могу скомпоновать.
А то что, Вы, Дмитрий, создаёте под свою руку графический редактор - это прекрасно.
Не важно, есть ли такие или получше, но возможность создавать что-то своими руками - это незабываемое ощущение.
Мне тоже увлекает сборка, чинить компьютеры. Родственники, знакомые несут устаревшие, сломанные компьютеры- "хлам" как они говорят. Из этого барахла собираю компьютеры. Очень хотелось бы научиться компьютерному программированию, но боюсь силёнок не хватит. Со школы как-то особо не был в ладах с математикой. Цифры, формулы утомляют, видимо не моя стихия.
А так,читая Вас, убеждаешься - можно всё, если есть желание.
Буду время от времени заходить к Вам на страницу. Тут масса идей научиться, да и приятно познакомиться с творческим человеком.
С уважением,

Влад Алексеев 2   04.01.2020 19:58     Заявить о нарушении
А я вот с компьютерным "железом" не очень дружу. В старых компьютерах кое-что понимал, но сейчас новая база. Однако, есть молодёжь, которая мне с ремонтом современной техники помогает. А я и паяльник-то свой потерял )).

Дмитрий Маштаков   05.01.2020 08:14   Заявить о нарушении
Зато у Вас неплохо получатся работать с программами.
Концовка "А я и паяльник-то свой потерял ))" замечательная, глубокомысленная, с долей юмора.

Влад Алексеев 2   05.01.2020 09:23   Заявить о нарушении