Как рассчитать область отсечения изображения после масштабирования и перевода
У меня есть изображение на холсте и ScaleTranform и TranslateTransform, прикрепленный к RenderTranform изображения. Таким образом, немного обработав события мыши, я могу перемещать и масштабировать изображение в пределах 350 на 450 границ холста.
Как бы рассчитать прямоугольник отсечения на исходном BitmapImage до видимой области на экране после некоторого масштабирования и перевода. Я хотел бы обрезать оригинальный BitmapImage.
<Border BorderBrush="Black" BorderThickness="2">
<Canvas Name="canvas" ClipToBounds="True" Height="450" Width="350">
<Image Name="image" Opacity="1" RenderTransformOrigin="0.5,0.5" Height="450" Width="350">
<Image.Source>
<BitmapImage UriSource="test.jpg"/>
</Image.Source>
</Image>
</Canvas>
</Border>
Спасибо
2 ответа
Я думаю, что было бы просто математически взять текущие значения ScaleTransform и выяснить, каков фактический размер изображения в данный момент, и тогда вы знаете, что у вас есть ящик 350x450, который вы собираетесь вырезать из этого, вам просто нужно использовать текущий TranslateTransform, чтобы понять это. Просто имейте в виду, что вы используете для происхождения этих преобразований, потому что это то, из чего вам нужно рассчитать.
То, что я сказал выше, предполагает, что сначала у вас есть ScaleTransform в вашем RenderTransform, а во втором TranslateTransform. Порядок операций здесь имеет значение.
Просто примените вычисления, выполненные к изображению преобразованиями, к границам... (И сделайте это в том же порядке...)
Поэтому, если вы увеличите его в 2 раза по X и Y, результирующий холст будет 450/2 x 350/2 (по размеру - происхождение пока неизвестно)
И я предполагаю, что было бы легче избежать TranslateTransform и просто поиграть с Origin of the ScaleTransform... тогда как Origin 0 должен дать вам Clip-origin 0, а X&Y Origin 1 приведет к тому, что изображение будет Нижний правый...
поэтому, чтобы настроить простую формулу..:
double W = 450;
double H = 350;
double SX = 2;
double SY = 2;
double OX = .3;
double OY = .3;
double newW = W / SX;
double newH = H / SY;
double newX = (W-newW) * OX;
double newY = (H-newH) * OY;
так newX,Y,W и H содержат данные, которые вы ищете!
С уважением, Дэйв