Делаю Резалку картинок - есть вопросы 1

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Делаю Резалку картинок - есть вопросы 1

Сообщение giaber » 07.06.2017 (Ср) 17:10

Здравствуйте!
Пишу для себя резалку картинок – часто нужно бывает разрезать на меньшие куски большую картинку или вырезать из неё определённые куски. Существующие проги не устраивают по функционалу да и выбор небольшой, а главное – интересно самому сделать, тем более после болезни я значительно ограничен в физических возможностях и пока не могу нормально заниматься прежними видами деятельности, комп и VB спасают от безделья.

Итак:
При клике левой мышью на картинке рисуются линии, по которым картинка будет разрезаться.
Режим рисования вертикальных и горизонтальных линий – раздельный, то есть кликаешь на баттон «Рисовать вертикальную» - можешь рисовать только вертикальные, соответственно для горизонтальных линий. Дальше для простоты рассматриваю только режим рисования вертикальных линий.

FormMain без рамок и контролбокса и на ней PictureBox, в который загружена картинка и на котором рисуются линии - имеют Top и Left 0, то есть координаты PictureBox совпадают с абсолютными координатами.
При при клике-рисовании линии в ListBox (Sorted = True) заносится координата X, в которой нарисовали линию.
При MouseMove за курсором, рядом, постоянно двигается маленький лейбл с инфой о координатах X и Y, но хочется сделать так, чтобы отображалась так же и инфа о дистанции в пикселах от курсора до ближайших правой и левой линий.
Но никак не могу сообразить, как это реализовать. Помогите идеей, пожалуйста!

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Делаю Резалку картинок - есть вопросы 1

Сообщение giaber » 08.06.2017 (Чт) 9:47

На данный момент сделал так:
Код: Выделить всё
Private Sub subCalcDistance()
    '
    frmMain.ListTMP.Clear 'очищаем листбокс
    frmMain.ListTMP.AddItem (0) 'добавляем первую запись - нулевую координату, как-бы в  0-й координате проведена линия
    '
    'копируем листбокс lstVX с записями координат Х в листбокс ListTMP
    For i = 0 To frmMain.lstVX.ListCount - 1 '
        frmMain.ListTMP.AddItem (frmMain.lstVX.List(i))
    Next i
    '
    frmMain.ListTMP.AddItem (CanvasWidth) 'добавляем последний элемент - ширина картинкиу, как-бы в  последней координате проведена линия
    '====================================================================
    '
    For i = 0 To frmMain.ListTMP.ListCount - 1 '
        '
        start = Val(frmMain.ListTMP.List(i)) 'берём линию
        finish = Val(frmMain.ListTMP.List(i + 1)) 'берём следующую линию
        gap = finish - start 'расстояние между линиями
        '
        For j = start To finish '
            DistanceL(j) = j - start '
            DistanceR(j) = gap - DistanceL(j) '
        Next j '
        '
        If frmMain.ListTMP.List(i) = frmMain.lstVX.List(frmMain.lstVX.ListCount - 1) Then Exit For 'выходим, если последняя, так как элемента i + 1 здесь уже не существует
        '
    Next i '
    '
End Sub


Работает, но не нравится.
Может кто-нибудь посоветует более гармоничный подход?

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Делаю Резалку картинок - есть вопросы 1

Сообщение pronto » 08.06.2017 (Чт) 15:09

Да, есть более гармоничный способ. Нужно только задуматься над тем, как из нагромождения линий выделить непересекающиеся прямоугольники. И решение приходит само собой :)
Вложения
Кадровщик.rar
(1.71 Кб) Скачиваний: 149
O, sancta simplicitas!

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Делаю Резалку картинок - есть вопросы 1

Сообщение giaber » 08.06.2017 (Чт) 15:45

Спасибо, pronto ! Попытаюсь разобраться - с первого прохода ни фига непонятно :(

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Делаю Резалку картинок - есть вопросы 1

Сообщение pronto » 08.06.2017 (Чт) 16:05

Основная идея в том, чтобы сразу работать с прямоугольниками (кадрами). В процессе движения курсора по полю определяется прямоугольник, внутри которого находится курсор. В зависимости от ориентации разделительной линии вычисляются расстояния. (Х, У) — координаты курсора. Индекс ТЕКУЩЕГО_КАДРА хранится в переменной CurrCadre.
Для вертикальных линий:
СЛЕВА = Х — ЛЕВО_ТЕКУЩЕГО_КАДРА;
СПРАВА = ПРАВО_ТЕКУЩЕГО_КАДРА — Х.

Для горизонтальных линий:
СВЕРХУ = У — ВЕРХ_ТЕКУЩЕГО_КАДРА;
СНИЗУ = НИЗ_ТЕКУЩЕГО_КАДРА — У.

При нажатии происходит «разделение» кадра на два по линии (SplitCadre).
O, sancta simplicitas!

giaber
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 108
Зарегистрирован: 14.01.2009 (Ср) 13:51

Re: Делаю Резалку картинок - есть вопросы 1

Сообщение giaber » 08.06.2017 (Чт) 17:15

Спасибо! Сижу, разбираюсь...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 43

    TopList