Страницы: 1
RSS
Вписывание фотографии в фигуру
 
Привет всем.
У меня есть макрос, который делает обрезку фотографий - которые добавляются на экран.
При этом он их группирует с прямоугольной фигурой - так чтобы фотографию в эту фигуру была вписана.

Однако иногда почему-то при этом (при каждом третьем срабатывании) - обрезанная фотография - оказывается - смещенной, что не есть хорошо.

Как изменить макрос, чтобы обрезаемое фото - оказывалось точно вписанным в прямоугольную фигуру, а не смещалась бы от этой фигуры ?
 
Доброе время суток
Цитата
radioamator написал:
при каждом третьем срабатывании) - обрезанная фотография - оказывается - смещенной
Попробовал на своих 10 фотографиях - указанного эффекта не получил. Приложите пример рисунка, на котором вы получаете такой сбой.
 
Может так:
Код
        If .Width > .Height Then
            .Height = shpHost.Height
            .Top = shpHost.Top
            .Left = shpHost.Left + shpHost.Width / 2 - .Width / 2
            .LockAspectRatio = msoFalse
            var = .Width
            .ScaleWidth (shpHost.Width / var), msoFalse, msoScaleFromMiddle
'            .PictureFormat.Crop.PictureWidth = var
        Else
            .Width = shpHost.Width
            .Left = shpHost.Left
            DoEvents

            .LockAspectRatio = msoFalse
            var = .Height
            .ScaleHeight (shpHost.Height / var), msoFalse, msoScaleFromMiddle
            .PictureFormat.Crop.PictureHeight = var
            .Top = shpHost.Top + shpHost.Height / 2 - shp.Height / 2
        End If
 
Александр Моторин, теперь, (хотя рисунок вписывается в фигуру) в некоторых случаях - макрос дополнительно растягивает рисунок.
Изменено: radioamator - 07.04.2019 17:48:49
 
Цитата
radioamator написал:
макрос дополнительно растягивает рисунок.
Тогда опишите задачу более полно, чтобы не приходилось догадываться по коду - что вы хотите, особенно в части обрезки изображения (и максимально подробно если высота растра больше его ширины).
 
Андрей VG, вот оформил - так чтобы видно было.
Вот тут например - колобок не обрезается а уменьшается в размерах.
Хотя он должен по меньшей стороне (по ширине или высоте) - растянуться,а все что выходит за пределы фигуры - должно обрезаться.
Изменено: radioamator - 07.04.2019 19:42:16
 
А если использовать в качестве фото - вот этот файл:
http://vospitatel.com.ua/images/k/kolobok-rastr.png

То получается - вот такой результат (рисунок вообще смещается куда-то вниз).
Здесь обрезка выполняется правильно, но итоговый результат располагается не в том месте (должен располагаться в пределах фигуры).
Изменено: radioamator - 07.04.2019 19:41:07
 
Цитата
Андрей VG написал:
если высота растра больше его ширины
Если высота растра - больше его ширины - это значит что растр с сохранением пропорций - должен растянутся по ширине (то есть по меньшей своей стороне) или сжаться по меньшей своей стороне - в общем подогнать ширину (меньшую сторону) - так чтобы она поместилась в фигуру.

А по высоте (большая сторона) - требуется тогда - обрезать растр, так чтобы он - идеально точно вписывался бы в фигуру.
 
Цитата
radioamator написал:
требуется тогда - обрезать растр, так чтобы он - идеально точно вписывался бы в фигуру.
Расшифруйте
Пусть пунктирный прямоугольник 200 шириной и 50 высотой. Картинка 500 шириной, 2000 высотой. Какой должен быть размер картинки?
 
Цитата
Андрей VG написал:
Пусть пунктирный прямоугольник 200 шириной и 50 высотой. Картинка 500 шириной, 2000 высотой. Какой должен быть размер картинки?
Итак.
Меньшая сторона картинки - это ширина (500 против 2000)

Это означает, что растр сперва растянет или сожмет (с сохранением пропорций) - свою ширину - под ширину пунктирного прямоугольника.
Будут большие области растра -  сверху и снизу  - не влезающие в пунктирный прямоугольник (поскольку большая высота растра и малая высота фигуры).
И вот эти не влезающие в пунктирный прямоугольник области растра - макрос обрежет.

А сам прямоугольник - может быть - каким угодно, с любым соотношением ширины и высоты - это не важно.
Все равно макрос оценивает какая меньшая сторона - именно у растра (а не у прямоугольной фигуры).
 
Цитата
radioamator написал:
И вот эти не влезающие в пунктирный прямоугольник области растра - макрос обрежет.
Тогда такой вариант (ширина пунктирного должна быть больше высоты, ну, или допиливать ;) )
 
Андрей VG, не работает.
У тех рисунков, у которых ширина больше высоты - не выполняет обрезку.
 
Бедный, бедный колобок - он должен быть обрезан :)  Круглый - он интереснее, чем получившаяся шайба.
 
Андрей VG, все равно что-то не работает.

Теперь этот круглый персонаж - не вписывается в фигуру вытянутую по вертикали.

Обрезка происходит - но как-то намного намного больше чем нужно.
 
Цитата
radioamator написал:
но как-то намного намного больше чем нужно
Есть такое дело.
Нужно vScale = picShape.Width / hostShape.Width перенести в соответствующие ветки If и, для изменения по высоте, рассчитывать его по отношению высот. Давайте вы тоже по участвуете. А то прям ателье какое-то получается. :)
 
Цитата
Андрей VG написал:
Нужно vScale = picShape.Width / hostShape.Width перенести в соответствующие ветки If и, для изменения по высоте, рассчитывать его по отношению высот.
А как это конкретно сделать ?
Вот я добавил новый блок IF для vScale, как вы сказали - но теперь не происходит обрезки по бокам.
 
Цитата
radioamator написал:
новый блок IF для vScale
Не нужен там новый блок. Нужно в существующие ветки добавить вычисление vScale от того измерения, к которому приводим рисунок (противоположное измерение - обрезаем). Моя ошибка в том, что я вычислял его строго по ширине.
 
Андрей VG, большое спасибо.
Теперь все очень хорошо работает.
Страницы: 1
Наверх