2009-04-13 40 views
2

我有一個非常大的圖像,我想用於精靈技術(àla css image sprites)。Silverlight圖像裁剪如何工作?

我有下面的代碼:

<Image x:Name="testImage" Width="24" Height="12" Source="../Resources/Images/sprites.png"> 
    <Image.Clip> 
     <RectangleGeometry Rect="258,10632,24,12" /> 
    </Image.Clip> 
</Image> 

這剪輯源圖像在258,10632源圖像中的相對位置24x12。

問題是我希望裁剪的圖像在testImage中顯示爲0,0,而在258,10632顯示它。它將幾何圖形用作切割指南,但也用作佈局指南

任何人有任何想法應該如何做? 如果根本就是

結論: 似乎是在目前這樣做的沒有什麼好辦法,格雷姆的解決方案似乎是最接近的Silverlight 2.0實現這一目標。

這就是說,如果有人知道這樣做的更好方法,請回答一個答案。

回答

3

事實證明這可以做到。

<Rectangle x:Name="myRect" Width="28" Height="12" /> 

ImageBrush imageBrush = new ImageBrush(); 
imageBrush.ImageSource = //Load in image source 
imageBrush.Stretch = Stretch.None; 
imageBrush.AlignmentX = AlignmentX.Left; 
imageBrush.AlignmentY = AlignmentY.Top; 

TranslateTransform offsetTransform = new TranslateTransform(); 
offsetTransform.X = -258; 
offsetTransform.Y = -10632; 

imageBrush.Transform = offsetTransform; 
1

假設你是一個帆布

<Image x:Name="testImage" Width="24" Height="12" Canvas.Left="-258" Canvas.Top="-10632" Source="../Resources/Images/sprites.png"> 
<Image.Clip> 
    <RectangleGeometry Rect="258,10632,24,12" /> 
</Image.Clip> 

使用WPF你可以使用一個CroppedBitmap但遺憾的是並不在Silverlight上存在。

<編輯>

隨着進一步的實驗,而無需使用畫布的解決方案:

<Image x:Name="testImage" Width="24" Height="12" Source="../Resources/Images/sprites.png"> 
    <Image.Clip> 
     <RectangleGeometry Rect="258,10632,24,12" /> 
    </Image.Clip> 
    <Image.RenderTransform> 
     <TranslateTransform X="-258" Y="10632"/> 
    </Image.RenderTransform> 
</Image> 

它做同樣的事情,在畫布上稍稍整潔。

+0

我喜歡你要去的地方在這裏,但改變圖像寬度24隱藏的內容。更改寬度會改變顯示原始圖像的哪一位。 – 2009-04-15 21:08:06

+0

我可以將寬度和高度保留爲原始寬度=「800」高度=「18928」,但這是正確的方式嗎? – 2009-04-15 21:10:26

+0

問題是Silverlight尚不支持你想要做的事情。 CroppedBitmap是正確的方式,但不幸的是只存在於WPF中。所以,除非你打開Reflector並自己實現,否則你只剩下Image – 2009-04-16 08:05:52

1

爲什麼這樣做,在這一切後,CSS圖像精靈的整點是使一個請求,而不是很多,以提高下載時間。但是,只需將所有圖像放入xap(或xap)中並將其下載到一個請求中即可實現。

+0

我認爲的問題是更多的圖像加載,而不是使用單個圖像*希望* Silverlight會內部優化的性能。 – 2009-04-18 18:19:39

+1

我敢打賭,你實際上會得到更高的內存使用量和更差的性能。除非你實際上已經證明了瓶頸,並且顯示這種「優化」的測量可以改善事情(這兩方面聽起來都不是),那麼你就是在浪費你的時間並降低你正在做的任何事情的質量。 – 2009-05-29 12:46:16

1

這是完全可行的 - 解決方案是使用負邊距而不是變換。只需設置一個負邊界頂部,然後左邊吃掉剪輯頂部/左邊的偏移量(在本例中爲258,10632)。對於源圖像的剩餘部分來說,還需要右邊和底部的負邊距;對於右邊距的計算公式爲:

-1 *(width_of_source - x_coord_of_clip - width_of_clip_region)