2015-10-16 63 views
0

我有保存在Base64中的图像,它们是风景和肖像的混合体。我想将它们全部显示为风景。在C#中,如何将Base64字符串转换为图像,然后旋转它?

我能够将Base64字符串转换为BitmapImages,然后将其设置为Image.Source,但我无法使旋转工作。

在这个类中,我从XML获取base64,然后调用SetupImage,它设置System.Windows.Controls.Image对象的源。

我试过两种旋转图像的方式(当宽度小于高度时)都在这个代码中。当我在BitmapImage上使用Rotation时,不会影响显示的图像。当我在图像上使用RotateTransform时,图像根本不显示。

public class TrayImage 
{ 
    [XmlAttribute("id")] 
    public string ID { get; set; } 
    [XmlAttribute("data")] 
    public string Data { get; set; } 

    /// <summary> 
    /// Create an Image from the Base64 Data 
    /// </summary> 
    internal void SetupImage(ref System.Windows.Controls.Image image) 
    { 
     if (this.Data != null) 
     { 
      // Convert the Base64 to a BitmapImage 
      byte[] _BinaryData = Convert.FromBase64String(this.Data); 

      BitmapImage _ImageBitmap = new BitmapImage(); 
      _ImageBitmap.BeginInit(); 
      _ImageBitmap.StreamSource = new MemoryStream(_BinaryData); 
      _ImageBitmap.EndInit(); 

      // If the image is portrait, rotate it 
      if (_ImageBitmap.Width < _ImageBitmap.Height) 
      { 
       // only use one rotation method at a time!! 
       //_ImageBitmap.Rotation = Rotation.Rotate90; 
      } 

      image.Source = _ImageBitmap; 

      // If the image is portrait, rotate it 
      if(image.Source.Width < image.Source.Height) 
      { 
       // only use one rotation method at a time!! 
       RotateTransform _RotateTransform = new RotateTransform(90); 
       image.RenderTransform = _RotateTransform; 
      } 
     } 
    } 
} 

我应该使用别的东西来转换,然后旋转图像?

+0

包括错误或什么是不工作....还我不使用REF上的粉丝引用类型,如果我是你,我会将其转换为静态方法。 – Seabizkit

+0

我没有收到错误信息,图像只是以原始方向显示,或根本不显示。我在代码中的其他地方使用了ID,但这里并不相关。 – mike

+0

是的,我认为它不会使用实际上被修改的图像!将其更改为返回图像的静态辅助类。 – Seabizkit

回答

0

像这样:这是为只有代码没有测试!

public static class ImageHelpers 
{ 
    punlic byte[] ConvertFromBase64(btye[] data) 
    { 
     return Convert.FromBase64String(data) 
    } 

    public Image Rotate90FromData(byte[] data) 
    { 
     Image image = null; 
     if (data != null) 
     {    
      BitmapImage _ImageBitmap = new BitmapImage(); 
      _ImageBitmap.BeginInit(); 
      _ImageBitmap.StreamSource = new MemoryStream(data); 
      _ImageBitmap.EndInit(); 

      image.Source = _ImageBitmap; 

      // If the image is portrait, rotate it 
      if(image.Source.Width < image.Source.Height) 
      { 
       RotateTransform _RotateTransform = new RotateTransform(90); 
       image.RenderTransform = _RotateTransform; 
      } 
     } 
     return Image; 
    } 
} 

public class Main 
{ 
    public void Start() 
    { 
     var data64 = ImageHelpers.ConvertFromBase64(somevar); 
     Image rotatedImage = ImageHelpers.Rotate90FromData(data64); 

    } 
} 
0

这里梳理建议后,和其他的问题,我想出了一个可行的解决方案。

这些都是我的“usings”

using System; 
using System.Xml.Serialization; 
using System.IO; 
using System.Windows.Media.Imaging; 
using System.Drawing; 

这里是我的满级

public class TrayImage 
{ 
    [XmlAttribute("id")] 
    public string ID { get; set; } 
    [XmlAttribute("data")] 
    public string Data { get; set; } 

    /// <summary> 
    /// Create an Image from the Base64 Data 
    /// </summary> 
    internal System.Windows.Controls.Image SetupImage() 
    { 
     System.Windows.Controls.Image _Image = new System.Windows.Controls.Image(); 

     if (this.Data != null) 
     { 
      BitmapImage _BitmapImage = this.CreateBitmapImage(); 
      Bitmap _Bitmap = this.BitmapImage2Bitmap(_BitmapImage); 

      // If the image is portrait, rotate it 
      if (_Bitmap.Width < _Bitmap.Height) 
      { 
       _Bitmap = this.RotateImage(_Bitmap, 90); 
      } 

      _Image.Source = this.BitmapToBitmapImage(_Bitmap); 
     } 

     return _Image; 
    } 

    /// <summary> 
    /// Convert a Bitmap into a BitmapImage 
    /// </summary> 
    private BitmapImage BitmapToBitmapImage(Bitmap bitmap) 
    { 
     using (MemoryStream _MemoryStream = new MemoryStream()) 
     { 
      bitmap.Save(_MemoryStream, System.Drawing.Imaging.ImageFormat.Bmp); 
      _MemoryStream.Position = 0; 
      BitmapImage _BitmapImage = new BitmapImage(); 
      _BitmapImage.BeginInit(); 
      _BitmapImage.StreamSource = _MemoryStream; 
      _BitmapImage.CacheOption = BitmapCacheOption.OnLoad; 
      _BitmapImage.EndInit(); 

      return _BitmapImage; 
     } 
    } 

    /// <summary> 
    /// Convert a Base64 String into a BitmapImage 
    /// </summary> 
    private BitmapImage CreateBitmapImage() 
    { 
     byte[] _BinaryData = Convert.FromBase64String(this.Data); 

     BitmapImage _ImageBitmap = new BitmapImage(); 
     _ImageBitmap.BeginInit(); 
     _ImageBitmap.StreamSource = new MemoryStream(_BinaryData); 
     _ImageBitmap.EndInit(); 

     return _ImageBitmap; 
    } 

    /// <summary> 
    /// Convert a BitmapImage into a Bitmap 
    /// </summary> 
    private Bitmap BitmapImage2Bitmap(BitmapImage bitmapImage) 
    { 
     using (MemoryStream _OutStream = new MemoryStream()) 
     { 
      BitmapEncoder _Encoder = new BmpBitmapEncoder(); 
      _Encoder.Frames.Add(BitmapFrame.Create(bitmapImage)); 
      _Encoder.Save(_OutStream); 
      System.Drawing.Bitmap _Bitmap = new System.Drawing.Bitmap(_OutStream); 

      return new Bitmap(_Bitmap); 
     } 
    } 

    /// <summary> 
    /// Rotate a Bitmap 
    /// </summary 
    private Bitmap RotateImage(Bitmap bitmap, float angle) 
    { 
     int _Width = bitmap.Width; 
     int _Height = bitmap.Height; 
     float _MoveX = (float)_Height/2; 

     // Create bitmap with Height/Width revered 
     Bitmap _ReturnBitmap = new Bitmap(_Height, _Width); 

     // Make a graphics object from the empty bitmap 
     using (Graphics _Graphics = Graphics.FromImage(_ReturnBitmap)) 
     { 
      // Move image along x axis 
      _Graphics.TranslateTransform(_MoveX, 0); 

      // Rotate image 
      _Graphics.RotateTransform(angle); 

      // Move image back along x axis 
      // NB, now it's been rotated, the x and y axis have swapped from our perspective. 
      _Graphics.TranslateTransform(0, -_MoveX); 

      // Draw passed in image onto graphics object 
      _Graphics.DrawImage(bitmap, new Point(0, 0)); 
     } 
     return _ReturnBitmap; 
    } 
} 
相关问题