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

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的方法,這裡我們借用一下即可:

代碼
<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>

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