Как рассчитать область отсечения изображения после масштабирования и перевода - PullRequest
0 голосов
/ 17 мая 2011

У меня есть изображение на холсте, а 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 ]

1 голос
/ 17 мая 2011

Я бы подумал, что было бы просто математически взять текущие значения ScaleTransform и выяснить, каков фактический размер изображения в данный момент, и тогда вы узнаете, что у вас есть коробка 350x450, которую вы собираетесь вырезатьдля этого вам просто нужно использовать текущий TranslateTransform, чтобы понять это.Просто имейте в виду, что вы используете для происхождения этих преобразований, потому что это то, что вам нужно для его вычисления.

То, что я сказал выше, предполагает, что у вас есть ScaleTransform сначала в вашем RenderTransform, а второй TranslateTransform,Порядок операций здесь имеет значение.

0 голосов
/ 17 мая 2011

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

Так что, если вы увеличите его в 2 раза по X и Y результирующий холст будет 450/2 x 350/2 (по размеру - происхождение пока неизвестно)

И я думаю, что было бы легче избежать TranslateTransform и просто поиграть с Origin of 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 содержат данные, которые вы ищете!

С уважением, Дэйв

...