WPF 图片旋转

    图片旋转,我的前台界面是这样的布局编码:

        
            
                
                
                
                
            
            
                
                    
                    

,我用到了Slider控件来绑定Image.RenderTransform,控制图片的旋转,文本框则显示旋转角度,当然文本框也可以输入数值来旋转图片,在后台计算透明背景:

 canvas.Width = Math.Abs(image1.ActualWidth*Math.Cos(rotran.Angle*Math.PI/180.0)) +
                           Math.Abs(image1.ActualWidth*Math.Sin(rotran.Angle*Math.PI/180.0)) + 20;    //加20以防透明背景不能完全包含图片
            canvas.Height = Math.Abs(image1.ActualHeight*Math.Cos(rotran.Angle*Math.PI/180.0)) +
                            Math.Abs(image1.ActualHeight*Math.Sin(rotran.Angle*Math.PI/180.0)) + 20;

            image1.Margin = new Thickness(((this.canvas.Width - this.image1.ActualWidth)/2),
                ((this.canvas.Height - this.image1.ActualHeight)/2 ),
                ((this.canvas.Width - this.image1.ActualWidth)/2), ((this.canvas.Height - this.image1.ActualHeight)/2));
            angle.Text = slider.Value.ToString();

保存图片为大图即图片原大小必须包含在内那么生成新图片时

/// 
        /// 完成图片旋转,将流返回主窗口
        /// 
        /// 
        /// 
      
        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            try
            { 
                stream2 = GetImageFromControl2();
                MainImg.act(stream2);
                this.Close();


            }
            catch (Exception ex)
            {
                ErrorMain error = new ErrorMain("Error:" + ex.TargetSite.ToString() + "&&&" + ex.Message + "&&&" + ex.Source);
                error.ShowDialog();
            }


        }
//调用这个方法将信息转换成流形式,这样是为了主窗口接收,读取流转化为BitmapImage就可以了
( 像这样:   BitmapImage bitimg = new BitmapImage();
                bitimg.BeginInit();
                bitimg.StreamSource = stream2;
                bitimg.EndInit();)
 private Stream GetImageFromControl2()
        {
            image1.Width = newPathImg.PixelWidth;
            image1.Height = newPathImg.PixelHeight;
            canvas.Height = Math.Abs(image1.Height*Math.Cos(rotran.Angle*Math.PI/180.0)) +
                               Math.Abs(image1.Width*Math.Sin(rotran.Angle*Math.PI/180.0)) + 50;
            canvas.Width = Math.Abs(image1.Width*Math.Cos(rotran.Angle*Math.PI/180.0)) +
                              Math.Abs(image1.Height*Math.Sin(rotran.Angle*Math.PI/180.0)) + 50;
           
            MemoryStream ms = null;

            DrawingVisual drawingVisual = new DrawingVisual();

            using (DrawingContext context = drawingVisual.RenderOpen())
            {

                VisualBrush brush = new VisualBrush(canvas) { Stretch = Stretch.Fill };

                context.DrawRectangle(brush, null, new Rect(0, 0, canvas.Width, canvas.Height));

                context.Close();
            }
            //dpi可以自己设定   // 获取dpi方法:PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice
            RenderTargetBitmap bitmap = new RenderTargetBitmap((int)canvas.Width, (int)canvas.Height, 96d, 96d, PixelFormats.Default);
           // RenderTargetBitmap bitmap = new RenderTargetBitmap(int.Parse(canvas.Width.ToString("F0")), int.Parse(canvas.Height.ToString("F0")), 1d, 1d, PixelFormats.Pbgra32);
           // MessageBox.Show("宽为:"+canvas.Width+",高为:"+canvas.Height);
            bitmap.Render(drawingVisual);

            PngBitmapEncoder encode = new PngBitmapEncoder();

            encode.Frames.Add(BitmapFrame.Create(bitmap));

            ms = new MemoryStream();

            encode.Save(ms);

            return ms;

        }
这样就可以了。


这中间有一些编码省略掉了,这些方法可以哈。

你可能感兴趣的:(WPF 图片旋转)