Windows 8 使用动态矩形坐标裁剪图像

Windows 8 使用动态矩形坐标裁剪图像,windows-8,windows-runtime,microsoft-metro,windows-store-apps,winrt-xaml,Windows 8,Windows Runtime,Microsoft Metro,Windows Store Apps,Winrt Xaml,我有一个图像,我想用一个矩形裁剪它,下面的代码是我放一个图像并在图像中间画一个矩形的代码: MainPage.Xaml: <Canvas x:Name="canvas" HorizontalAlignment="Center" VerticalAlignment="Center" Width="340" Height="480" Background="Blue"> <Image x:Name="photo" HorizontalAlignment="Cente

我有一个图像,我想用一个矩形裁剪它,下面的代码是我放一个图像并在图像中间画一个矩形的代码:

MainPage.Xaml:

<Canvas x:Name="canvas" HorizontalAlignment="Center" VerticalAlignment="Center" Width="340" Height="480" Background="Blue">
        <Image x:Name="photo" HorizontalAlignment="Center" VerticalAlignment="Center" ManipulationMode="All">
            <Image.RenderTransform>
                <CompositeTransform/>
            </Image.RenderTransform>
        </Image>
        <Path Stroke="Black" StrokeThickness="1">
            <Path.Data>
                <RectangleGeometry Rect="0,0,340,480"/>
            </Path.Data>
        </Path>
    </Canvas>

使用下面的代码,矩形将位于屏幕中间,图像可以平移。矩形内的内容将被剪裁


private CompositeTransform compositeTranslation;
矩形几何体rect=新矩形几何体();
公共网页4()
{
this.InitializeComponent();
rect.rect=newrect((Window.Current.Bounds.Width-480)/2,(Window.Current.Bounds.Height-340)/2480340);
path.Data=rect;
}
受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
{
photo.ManipulationDelta+=复合_-ManipulationDelta;
compositeTranslation=新的CompositeTransform();
photo.RenderTransform=this.compositeTranslation;
}
私有无效btnCrop_单击(对象发送方,路由目标)
{
GeneralTransform gt=photo.TransformToVisual(空);
点pt=gt.TransformPoint(新点(0,0));
var _rect=新矩形几何体();
_rect.rect=new rect((rect.Bounds.X/compositeTranslation.ScaleX)-(pt.X/compositeTranslation.ScaleX),(rect.Bounds.Y/compositeTranslation.ScaleY)-(pt.Y/compositeTranslation.ScaleY)-(pt.Y/compositeTranslation.ScaleX),480/compositeTranslation.ScaleX,340/compositeTranslation.ScaleY);
photo.Clip=_rect;
}
void Composite_操纵delta(对象发送器,操纵deltaroutedventargs e)
{
//缩放图像。
compositeTranslation.CenterX=photo.ActualWidth/2;
compositeTranslation.CenterY=photo.ActualHeight/2;
compositeTranslation.ScaleX*=e.Delta.Scale;
compositeTranslation.ScaleY*=e.Delta.Scale;
compositeTranslation.TranslateX+=e.Delta.Translation.X;
compositeTranslation.TranslateY+=e.Delta.Translation.Y;
}
更新:按照Howard Hee的指示更新代码
解决了放大/缩小只显示黑屏的问题

那么矩形的位置应该是什么?它也应该和矩形一起移动?矩形和图像的相对位置应该固定?矩形固定在屏幕中间,只有图像可以移动。矩形裁剪大小始终为340x480。感谢矩形应该在屏幕或图像的中间?矩形应该在中间。矩形应该在屏幕的中间,图像可以平移。矩形内的内容将被剪裁,对吗?但当我缩小并单击“裁剪”时,剪裁的图像将不在矩形内。你能解决吗?最后我把代码改成这个来解决这个问题_rect.rect=new rect((rect.Bounds.X/compositeTranslation.ScaleX)-(pt.X/compositeTranslation.ScaleX),(rect.Bounds.Y/compositeTranslation.ScaleY)-(pt.Y/compositeTranslation.ScaleY)-(pt.Y/compositeTranslation.ScaleX),480/compositeTranslation.ScaleX,340/compositeTranslation.ScaleY)
public sealed partial class MainPage: Page
{
        private CompositeTransform compositeTranslation;

        public MainPage()
        {
            this.InitializeComponent();
            photo.ManipulationDelta += Composite_ManipulationDelta;
            compositeTranslation = new CompositeTransform();
            photo.RenderTransform = this.compositeTranslation;
        }

        void Composite_ManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs e)
        {
            // scale the image.
            compositeTranslation.CenterX = photo.ActualWidth / 2;
            compositeTranslation.CenterY = photo.ActualHeight / 2;
            compositeTranslation.ScaleX *= e.Delta.Scale;
            compositeTranslation.ScaleY *= e.Delta.Scale;
            compositeTranslation.TranslateX += e.Delta.Translation.X;
            compositeTranslation.TranslateY += e.Delta.Translation.Y;
        }

        private void btnCrop_Click(object sender, RoutedEventArgs e)
        {
            var _rect = new RectangleGeometry();
            _rect.Rect = path.Data.Bounds;
            photo.Clip = _rect;
        }
}