base64编码在silverlight中的使用

在传统的.net应用中,使用base64编码字符串是一件很轻松的事情,比如下面这段代码演示了如何将本地文件转化为base64字符串,并且将base64字符串又还原为图片文件.

base64编码在传统.net程序中的应用(by 菩提树下的杨过 )

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);
        }

 /// <summary>
 /// 从base64字符串还原图片
 /// </summary>
 /// <param name="base64string"></param>
 /// <returns></returns>
 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;
using System.IO;
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();
        }

 /// <summary>
 /// 老外写的方法:将WriteableBitmap转化为base64位字符串
 /// </summary>
 /// <param name="bitmap"></param>
 /// <returns></returns>
 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

转载请注明出处(菩提树下的杨过 )

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java成神之路

Java企业微信开发_02_通讯录同步

       登录企业微信—>管理工具—>通讯录同步助手—>开启“API接口同步”  ; 开启后,即可看到通讯录密钥,也可设置通讯录API的权限:读取或者编辑通...

8852
来自专栏马洪彪

IniHelper——INI操作辅助类

使用INI配置文件,简单便捷。 该辅助工具类为C#操作INI文件的辅助类,源码在某位师傅的基础上完善的来,因为忘记最初的来源了,因此不能提及引用,在此深感遗憾,...

4147
来自专栏拂晓风起

jQuery 和 json 简单例子(注意callback函数的处理!!) (servlet返回json,jquery更新,java json)

1223
来自专栏函数式编程语言及工具

Akka(8): 分布式运算:Remoting-远程查找式

  Akka是一种消息驱动运算模式,它实现跨JVM程序运算的方式是通过能跨JVM的消息系统来调动分布在不同JVM上ActorSystem中的Actor进行运算,...

4369
来自专栏码匠的流水账

聊聊spring-data-redis的连接池的校验

spring-data-redis/2.0.10.RELEASE/spring-data-redis-2.0.10.RELEASE-sources.jar!/o...

6731
来自专栏拂晓风起

cocos2d-js Shader系列4:Shader、GLProgram在jsb(native、手机)和html5之间的兼容问题。cocos2d-js框架各种坑。

2124
来自专栏个人分享

Hive metastore源码阅读(一)

  不要问我为什么,因为爱,哈哈哈哈。。。进入正题,最近做项目顺带学习了下hive metastore的源码,进行下知识总结。

2801
来自专栏码匠的流水账

聊聊jesque的WorkerImpl与WorkerPool

Resque是一个使用redis来创建后台任务的ruby组件。而jesque是其java版本。通常用来做延时队列。

751
来自专栏10km的专栏

jface databinding:重写doSetValue方法ComputedValue实现双向多对一的数据绑定

需求说明 如下是一个简单的测试对话框,我们希望当”起始日期”按钮为勾选时,数据对象dataBean的date属性为日期组件DateTime选择的值,否则为nul...

2469
来自专栏码匠的流水账

聊聊rocketmq的PushConsumerImpl

io/openmessaging/rocketmq/consumer/PushConsumerImpl.java

1882

扫码关注云+社区

领取腾讯云代金券