none
window8 如何较简单实现图片剪切和缩放? RRS feed

  • 问题

  • 从系统导入图片,然后生成固定定大小比如400*400的图片:如果导入的图片太大进行压缩处理,如果图片太小用黑色填充补充
    2012年11月25日 19:21

答案

全部回复

  • 自己使用photoshop或者Office Photo viewer编辑吧。。。
    2012年11月26日 6:59
  • 你可以做一个自定义控件,如下是一个简单的思路,你可以自己完善剩余的代码。

    Xaml:

    <Grid Background="Black">
            <Image VerticalAlignment="Center" HorizontalAlignment="Center" ImageOpened="Image_ImageOpened_1"/>
    </Grid>

    在Code behind代码中:

    private async void Image_ImageOpened_1(object sender, RoutedEventArgs e)
            {
     var image = sender as Image;
                    var source = image.GetValue(Image.SourceProperty) as Windows.UI.Xaml.Media.Imaging.BitmapImage;
    
                    #region change the image stretch
                    if (source.PixelHeight < this.ActualHeight && source.PixelWidth < this.ActualWidth)
                        image.Stretch = Stretch.None;
                    else
                        image.Stretch = Stretch.Uniform;
                    #endregion
            }

    Thanks! Damon.Tian

    2012年11月26日 7:37
  • 你可以做一个自定义控件,如下是一个简单的思路,你可以自己完善剩余的代码。

    Xaml:

    <Grid Background="Black">
            <Image VerticalAlignment="Center" HorizontalAlignment="Center" ImageOpened="Image_ImageOpened_1"/>
    </Grid>

    在Code behind代码中:

    private async void Image_ImageOpened_1(object sender, RoutedEventArgs e)
            {
     var image = sender as Image;
                    var source = image.GetValue(Image.SourceProperty) as Windows.UI.Xaml.Media.Imaging.BitmapImage;
    
                    #region change the image stretch
                    if (source.PixelHeight < this.ActualHeight && source.PixelWidth < this.ActualWidth)
                        image.Stretch = Stretch.None;
                    else
                        image.Stretch = Stretch.Uniform;
                    #endregion
            }

    Thanks! Damon.Tian


    先谢谢了 不过我的 需求没那么简单 需要要代码来剪切和压缩图片,不是调简单的控件属性。。。
    2012年11月26日 8:53
  • 把你的图片流初始化一个位图解码器类,然后对位图进行转换(压缩等)

                        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);

                        BitmapTransform transform = new BitmapTransform() {
                            ScaledWidth = Convert.ToUInt32(Scenario4WriteableBitmap.PixelWidth),
                            ScaledHeight = Convert.ToUInt32(Scenario4WriteableBitmap.PixelHeight)};
                       
                        PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
                            BitmapPixelFormat.Bgra8,    
                            BitmapAlphaMode.Straight,
                            transform,
                            ExifOrientationMode.IgnoreExifOrientation, 
                            ColorManagementMode.DoNotColorManage);

                        byte[] sourcePixels = pixelData.DetachPixelData();

                        using (Stream stream = WriteableBitmap.PixelBuffer.AsStream())
                        {
                            await stream.WriteAsync(sourcePixels, 0, sourcePixels.Length);
                        }

    2012年11月26日 9:08
  • 把你的图片流初始化一个位图解码器类,然后对位图进行转换(压缩等)

                        BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStream);

                        BitmapTransform transform = new BitmapTransform() {
                            ScaledWidth = Convert.ToUInt32(Scenario4WriteableBitmap.PixelWidth),
                            ScaledHeight = Convert.ToUInt32(Scenario4WriteableBitmap.PixelHeight)};
                       
                        PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
                            BitmapPixelFormat.Bgra8,    
                            BitmapAlphaMode.Straight,
                            transform,
                            ExifOrientationMode.IgnoreExifOrientation, 
                            ColorManagementMode.DoNotColorManage);

                        byte[] sourcePixels = pixelData.DetachPixelData();

                        using (Stream stream = WriteableBitmap.PixelBuffer.AsStream())
                        {
                            await stream.WriteAsync(sourcePixels, 0, sourcePixels.Length);
                        }


    这个如果图片太小,没法办法填充黑色吧!!!
    2012年11月26日 10:29
  • 小图剪切后要实现这种效果

    2012年11月27日 1:51
  • Hi,

    那可以使用WriteableBitmap来做。可以通过PixelBuffer直接对像素进行操作,不过WinRT里WriteableBitmap大幅简化过,你可以试试使用第三方工具WriteableBitmapEx来做。

    WriteableBitmapEx:

    http://writeablebitmapex.codeplex.com/


    Aaron Xue [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月28日 10:04
    版主