在画布或滚动视图中裁剪图像?

时间:2013-10-03 15:06:22

标签: image canvas windows-8 crop windows-8.1

我已将图像放在scrollview和canvas中,如下面的xaml所示:

<ScrollViewer x:Name="scroll" HorizontalAlignment="Center" VerticalAlignment="Center" Width="340" Height="480">
                <Canvas x:Name="canvas" HorizontalAlignment="Center" VerticalAlignment="Center" Width="340" Height="480" Background="Blue">
                <Image x:Name="photo" Stretch="Fill" HorizontalAlignment="Center" VerticalAlignment="Center" ManipulationMode="All" Width="340" Height="480">
                        <Image.RenderTransform>
                            <CompositeTransform/>
                        </Image.RenderTransform>
                    </Image>
                </Canvas>
</ScrollViewer>

之后,我创建了一个加载和裁剪图像的按钮:

private async void btnCrop_Click(object sender, RoutedEventArgs e)
{
            FileOpenPicker fileOpenPicker = new FileOpenPicker();
            fileOpenPicker.ViewMode = PickerViewMode.Thumbnail;
            fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
            fileOpenPicker.FileTypeFilter.Add(".jpg");
            fileOpenPicker.FileTypeFilter.Add(".jpeg");
            fileOpenPicker.FileTypeFilter.Add(".png");
            fileOpenPicker.FileTypeFilter.Add(".bmp");
            file = await fileOpenPicker.PickSingleFileAsync();

            if (file != null)
            {
                var fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);
                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);
                BitmapTransform transform = new BitmapTransform();
                BitmapBounds bounds = new BitmapBounds();
                bounds.X = bounds.Y = 0;
                bounds.Height = bounds.Width = 150;
                transform.Bounds = bounds;

                PixelDataProvider pix = await decoder.GetPixelDataAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, transform, ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb);
                byte[] pixels = pix.DetachPixelData();
                WriteableBitmap cropBmp = new WriteableBitmap(340, 480);
                Stream pixStream = cropBmp.PixelBuffer.AsStream();
                pixStream.Write(pixels, 0, 150 * 150 * 4);
                photo.Source = cropBmp;
            }
}

图像已裁剪并显示成功。但是当我缩放图像时,我只想在画布中裁剪图像而不是硬编码。上面的代码是BitmapBounds宽度和高度的硬编码。我该如何解决?感谢

0 个答案:

没有答案