Использование RenderTransform с клипом работает еще лучше, потому что CroppedBitmap довольно неизменен:
<Image x:Name="MyImage">
<Image.RenderTransform>
<TranslateTransform X="-100" Y="-100" />
</Image.RenderTransform>
<Image.Clip>
<RectangleGeometry Rect="0 0 250 250" />
</Image.Clip>
</Image>
При этом изображение будет отображаться со смещением (100, 100) с размером (150, 150), поэтому не забывайте, что прямоугольник должен включать начальные смещения.
Вот метод для расчета в коде:
public static void ClipImage(System.Windows.Controls.Image image, Rect visibleRect)
{
image.RenderTransform = new TranslateTransform(-visibleRect.X, -visibleRect.Y);
image.Clip = new RectangleGeometry
{
Rect = new Rect(
0,
0,
visibleRect.X + visibleRect.Width,
visibleRect.Y + visibleRect.Height)
};
}