C# 滚动时平滑图像剪辑

C# 滚动时平滑图像剪辑,c#,windows-phone-7,scroll,image-clipping,C#,Windows Phone 7,Scroll,Image Clipping,因此,我试图在使用PhotoChooserTask时获得像本地种植者一样的效果。如果您不熟悉,则背景中有一个图像,其顶部有一个边框,并且该图像在进出边框时似乎会改变不透明度。下面的代码工作正常,但不是非常平滑(剪裁的图像稍微滞后于拖动运动)。有没有办法加快剪辑或更改内容,以减少延迟?我有以下XAML: <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" HorizontalAlignment="Center" Vertic

因此,我试图在使用PhotoChooserTask时获得像本地种植者一样的效果。如果您不熟悉,则背景中有一个图像,其顶部有一个边框,并且该图像在进出边框时似乎会改变不透明度。下面的代码工作正常,但不是非常平滑(剪裁的图像稍微滞后于拖动运动)。有没有办法加快剪辑或更改内容,以减少延迟?我有以下XAML:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" HorizontalAlignment="Center" VerticalAlignment="Center">
    <Grid x:Name="cropContainer" Width="375" MouseLeftButtonDown="cropContainer_MouseLeftButtonDown" MouseLeftButtonUp="cropContainer_MouseLeftButtonUp" MouseMove="cropContainer_MouseMove">
        <Grid.RenderTransform>
            <TranslateTransform x:Name="cropTransform" />
        </Grid.RenderTransform>
        <Image x:Name="fullImage" Source="{Binding Image}" Opacity=".5" />
        <Image x:Name="clippedImage" Source="{Binding Image}">
            <Image.Clip>
                <RectangleGeometry Rect="0,0,375,267" />
            </Image.Clip>
        </Image>
    </Grid>
</Grid>
<Border x:Name="cropBorder" Grid.Row="1" BorderThickness="1" BorderBrush="White" Opacity="1" Height="267.90571169537624660018132366274" Width="375">
</Border>

下面是滑动过程中跟踪和剪裁的代码:

private Point _cropBorderOffset, _original, _newPosition;
private bool _moving;
private double _maxUp, _maxDown;

void Page_Loaded(object sender, RoutedEventArgs e)
{
    var transform = cropBorder.TransformToVisual(Application.Current.RootVisual);
    _cropBorderOffset = transform.Transform(new Point(0, 0));

    _maxDown = ((fullImage.ActualHeight - cropBorder.ActualHeight) / 2);
    _maxUp = -_maxDown;

    var rect = (clippedImage.Clip as RectangleGeometry).Rect;
    (clippedImage.Clip as RectangleGeometry).Rect = new Rect(rect.X, (fullImage.ActualHeight / 2) - 134, rect.Width, rect.Height);
}

private void cropContainer_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    cropContainer.CaptureMouse();
    _original = e.GetPosition(cropBorder);
    _moving = true;
}

private void cropContainer_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    cropContainer.ReleaseMouseCapture();
    _moving = false;
}

private void cropContainer_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
    _newPosition = e.GetPosition(cropBorder);

    if(_moving)
    {
        var deltaY = _newPosition.Y - _original.Y;

        var transform = fullImage.TransformToVisual(Application.Current.RootVisual);
        var fullImageOffset = transform.Transform(new Point(0, 0));

        var marginTop = deltaY;

        //Too far down
        if (marginTop > _maxDown)
        {
            marginTop = _maxDown;
        }
        //Too far up
        else if (marginTop < _maxUp)
        {
            marginTop = _maxUp;
        }

        cropTransform.Y = marginTop;

        var rect = (clippedImage.Clip as RectangleGeometry).Rect;
        (clippedImage.Clip as RectangleGeometry).Rect = new Rect(rect.X, _cropBorderOffset.Y - fullImageOffset.Y, rect.Width, rect.Height);
    }
}
private Point\u cropborderofset,\u original,\u newPosition;
私人楼宇搬家;
私人双路_maxUp,_maxDown;
已加载无效页面(对象发送器、路由目标)
{
var transform=croporder.TransformToVisual(Application.Current.RootVisual);
_cropborderofset=transform.transform(新点(0,0));
_maxDown=((fullImage.ActualHeight-croporder.ActualHeight)/2);
_maxUp=-\u maxDown;
var rect=(clippedImage.Clip作为矩形几何体).rect;
(clippedImage.Clip作为矩形几何体)。Rect=新的Rect(Rect.X,(fullImage.ActualHeight/2)-134,Rect.Width,Rect.Height);
}
私有void cropContainer_MouseLeftButtonDown(对象发送器,System.Windows.Input.MouseButtonEventArgs e)
{
cropContainer.CaptureMouse();
_原始=e.GetPosition(CropOrder);
_移动=真;
}
私有void cropContainer_MouseLeftButtonUp(对象发送器,System.Windows.Input.MouseButtonEventArgs e)
{
cropContainer.ReleaseMouseCapture();
_移动=假;
}
私有void cropContainer\u MouseMove(对象发送方,System.Windows.Input.MouseEventArgs e)
{
_newPosition=e.GetPosition(CropOrder);
如果(_移动)
{
var deltaY=_newPosition.Y-_original.Y;
var transform=fullImage.TransformToVisual(Application.Current.RootVisual);
var fullImageOffset=transform.transform(新点(0,0));
var marginTop=三角洲;
//太深了
如果(marginTop>\u maxDown)
{
marginTop=_maxDown;
}
//太远了
否则如果(marginTop<\u maxUp)
{
marginTop=_maxUp;
}
cropTransform.Y=marginTop;
var rect=(clippedImage.Clip作为矩形几何体).rect;
(clippedImage.Clip作为矩形几何体)。Rect=新的Rect(Rect.X,_cropborderofset.Y-fullImageOffset.Y,Rect.Width,Rect.Height);
}
}

不必绘制两次图像,一次带剪裁,一次不带剪裁,你能不能简单地绘制半透明矩形以阻挡侧面并为中心绘制白色轮廓?这将大大减少滞后


选择位置后,您可以使用剪切矩形的左侧、顶部、宽度和高度在内存中进行实际裁剪。

问题是我有一个纹理背景,因此它们会很明显。您可以发布应用程序现在的屏幕截图吗?看看背景如何影响这个问题会很有趣。遗憾的是,我不能。但这是一个纸纹理的背景,虽然它不会影响它一吨,但它确实影响了它一点,超过了预期。