天天看點

base64編碼在silverlight中的使用

在傳統的.net應用中,使用base64編碼字元串是一件很輕松的事情,比如下面這段代碼示範了如何将本地檔案轉化為base64字元串,并且将base64字元串又還原為圖檔檔案.

base64編碼在silverlight中的使用
base64編碼在silverlight中的使用

base64編碼在傳統.net程式中的應用(by 菩提樹下的楊過 http://yjmyzz.cnblogs.com/)

using System;

using System.Drawing;

using System.Drawing.Imaging;

using System.IO;

namespace Base64Study

{

    /// <summary>

    /// base64編碼在傳統.net程式中的應用(by 菩提樹下的楊過 http://yjmyzz.cnblogs.com/)

    /// </summary>

    class Program

    {

        static void Main(string[] args)

        {           

            string imgstring = GetBase64FromFile("c:\\self.png");

            Console.WriteLine(imgstring);

            Bitmap bitmap = GetImageFromBase64(imgstring);

            bitmap.Save("c:\\self2.png", ImageFormat.Png);

            Console.Read();

        }

        /// <summary>

        /// 将檔案轉換為base64字元串

        /// </summary>

        /// <param name="filePath"></param>

        /// <returns></returns>

        static string GetBase64FromFile(string filePath)         

        {

            byte[] b = File.ReadAllBytes(filePath);

            return Convert.ToBase64String(b);

        /// 從base64字元串還原圖檔

        /// <param name="base64string"></param>

        static Bitmap GetImageFromBase64(string base64string) 

            byte[] b = Convert.FromBase64String(base64string);

            MemoryStream ms = new MemoryStream(b);

            Bitmap bitmap = new Bitmap(ms);

            return bitmap;

    }

}

但是到了silverlight環境中,這種簡單的操作方式卻無法使用了,幸好網上有一個開源的免費元件FluxJpeg,同時國外有高人已經利用該元件寫出了将位圖轉化為base64的方法,這裡我們借用一下即可:

base64編碼在silverlight中的使用
base64編碼在silverlight中的使用

代碼

<UserControl x:Class="SLBase64.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

    mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">

  <StackPanel x:Name="LayoutRoot">

        <Image  x:Name="img" Height="100" Stretch="Uniform" Source="img/self.png"></Image>

        <Button x:Name="btnToBase64" Content="轉為base64字元串" Width="200" Margin="0,3,0,0"  Click="btnToBase64_Click"></Button>

        <TextBox Text="" x:Name="txtBase64" TextWrapping="Wrap" Height="150" Margin="0,3" VerticalScrollBarVisibility="Auto"></TextBox>

        <Button x:Name="btnToImg" Content="将上述base64字元串還原為圖檔" Width="200" Margin="0,0,0,3" Click="btnToImg_Click"></Button>

        <Image  x:Name="img2" Height="100" Stretch="Uniform"></Image>

    </StackPanel>

</UserControl>

base64編碼在silverlight中的使用
base64編碼在silverlight中的使用

using System.Windows;

using System.Windows.Controls;

using System.Windows.Media.Imaging;

using FluxJpeg.Core;

using FluxJpeg.Core.Encoder;

namespace SLBase64

    public partial class MainPage : UserControl

        public MainPage()

            InitializeComponent();

        /// 老外寫的方法:将WriteableBitmap轉化為base64位字元串

        /// <param name="bitmap"></param>

        private string GetBase64Image(WriteableBitmap bitmap)

            int width = bitmap.PixelWidth;

            int height = bitmap.PixelHeight;

            int bands = 3;

            byte[][,] raster = new byte[bands][,];

            for (int i = 0; i < bands; i++)

            {

                raster[i] = new byte[width, height];

            }

            for (int row = 0; row < height; row++)

                for (int column = 0; column < width; column++)

                {

                    int pixel = bitmap.Pixels[width * row + column];

                    raster[0][column, row] = (byte)(pixel >> 16);

                    raster[1][column, row] = (byte)(pixel >> 8);

                    raster[2][column, row] = (byte)pixel;

                }

            ColorModel model = new ColorModel { colorspace = ColorSpace.RGB };

            FluxJpeg.Core.Image img = new FluxJpeg.Core.Image(model, raster);

            MemoryStream stream = new MemoryStream();

            JpegEncoder encoder = new JpegEncoder(img, 100, stream);

            encoder.Encode();

            stream.Seek(0, SeekOrigin.Begin);

            byte[] binaryData = new Byte[stream.Length];

            long bytesRead = stream.Read(binaryData, 0, (int)stream.Length);

            string base64String =

                    System.Convert.ToBase64String(binaryData,

                                                  0,

                                                  binaryData.Length);

            return base64String;

        private void btnToBase64_Click(object sender, RoutedEventArgs e)

            WriteableBitmap wb = new WriteableBitmap(img, null);

            txtBase64.Text = "";

            txtBase64.Text = GetBase64Image(wb);

        private void btnToImg_Click(object sender, RoutedEventArgs e)

            if (txtBase64.Text == "") { return; }

            try

                img2.Source = null;

                byte[] b = Convert.FromBase64String(txtBase64.Text);

                MemoryStream ms = new MemoryStream(b);

                BitmapImage bitImage = new BitmapImage();

                bitImage.SetSource(ms);

                img2.Source = bitImage;

            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }

最後是示例源碼位址:http://files.cnblogs.com/yjmyzz/Base64Study.rar

繼續閱讀