2011-05-17 85 views
0

我在畫布上有一個圖像,ScaleTranform和附加到圖像RenderTranform的TranslateTransform。因此,通過一些鼠標事件處理,我可以在畫布的350 x 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> 

感謝

回答

0

簡單地套用在轉換完成的圖像,以邊界的計算... (並做到這一點以相同的順序...)

所以,如果您縮放它在X和Y上增加了2倍,因此得到的畫布將是450/2 x 350/2(尺寸 - 原點仍然未知)

而且我猜這樣會更容易避免TranslateTransform,玩 起源ScaleTransform的......而0原點應該給你的0 的夾式原點和X 1 & Y原點會造成影像是右下...

如此設置一些簡單的公式..:

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; 

so newX,Y,W和H包含您正在查找的數據!

問候, 戴夫

+0

謝謝,但我不覺得這很簡單。 350乘450只是「裁剪」區域(畫布)的大小。該圖像可以像像素中的任何尺寸一樣,並且仍然顯示在「剪輯」區域內作爲默認值(即縮放爲1且不翻譯時)。我只是認爲可能有一種構建方式可以將「WPF中與像素無關」的「屏幕上顯示的內容」映射到源圖像中的實際像素座標。 – Terje 2011-05-17 18:27:09

+0

不會很難適應...你能否提供一個簡單的虛擬項目和評論,你想獲得可見區域?我可以將幾行代碼放到它的... – santa 2011-05-18 10:32:18

1

我會認爲這是簡單的數學取當前ScaleTransform值,並找出圖像的實際大小是在什麼時間,然後你知道你有一個350x450那麼你只需要使用當前的TranslateTransform來解決這個問題。只要記住你使用這些轉換的起源,因爲這是你需要從中計算出來的。

我上面說的假設你在你的RenderTransform和TranslateTransform中第一次有ScaleTransform。這裏的操作順序確實很重要。

+0

感謝您提供關於「訂單確實重要」的提示。正如我寫@santa一樣,還有一個額外的維度,350x450盒子只是一些值,它表明了這個盒子在屏幕上有多大。如果我在盒子中放置一個1000x5000像素的圖片,默認情況下它仍然可以放入盒子中,直到您開始搞亂刻度。這使得它不那麼微不足道(至少對我來說)。 – Terje 2011-05-17 18:35:29

+0

Hrm ...圖像是否總是「填滿」盒子?換句話說,圖像的高寬比是否與該高寬比一致? – Tim 2011-05-17 18:43:33

+0

這是一個統一的填充,所以圖像的縱橫比是圖像的縱橫比,而不管盒子的大小。所以在開始時,根據圖像寬高比的不同,上下和左右都會出現白色邊框。 – Terje 2011-05-17 19:43:29