none
silverlight开发涂鸦板的问题 RRS feed

  • 问题

  • 用silverlight开发一个涂鸦板,可以实现将涂鸦板保存到本地的png文件.现在需要保存到服务器上去,应该如何做?如何将涂鸦板的数据保存到服务器并且生成一个.png的文件?而且.png文件保存在项目下的指定文件夹里!!
    2011年8月25日 4:56

答案

  • 你好,

    思路是这样的:

    1。写一个WebService用于把客户端的数据传到服务器。那可以定义这样一个方法SaveImage(Stream source, string path), 其中source为封装的涂鸦板数据,path为要在保存的服务器路径(你可以在Silverlight中以UI的形式模获取一个路径)。这个方法在服务端中以Stream形式去保存.png形式文件。

    2。在Silverlight端使用用WriteableBitmap的构造函数WriteableBitmap  (UIElement, Transform)获得一个WriteableBitmap实例(UIElement 可以把整个涂鸦板控件当参数传入)。然后把它转化为byte[],再转化为一个Stream。并攻取一个路径path。

    3. 调用第一步中的WebService(传入每二步中的Stream与path).


    Daoping Liu - MSFT
    2011年8月29日 2:37
    版主
  • private static string GetBase64Jpg(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, 90, 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; 
       
    } 

    这个就是将将WriteableBitmap一个一个像素扫描,大尺寸的时候需要很长时间。

    2011年8月31日 9:28

全部回复

  • 你好,

    思路是这样的:

    1。写一个WebService用于把客户端的数据传到服务器。那可以定义这样一个方法SaveImage(Stream source, string path), 其中source为封装的涂鸦板数据,path为要在保存的服务器路径(你可以在Silverlight中以UI的形式模获取一个路径)。这个方法在服务端中以Stream形式去保存.png形式文件。

    2。在Silverlight端使用用WriteableBitmap的构造函数WriteableBitmap  (UIElement, Transform)获得一个WriteableBitmap实例(UIElement 可以把整个涂鸦板控件当参数传入)。然后把它转化为byte[],再转化为一个Stream。并攻取一个路径path。

    3. 调用第一步中的WebService(传入每二步中的Stream与path).


    Daoping Liu - MSFT
    2011年8月29日 2:37
    版主
  • 2。在Silverlight端使用用WriteableBitmap的构造函数WriteableBitmap (UIElement, Transform)获得一个WriteableBitmap实例(UIElement 可以把整个涂鸦板控件当参数传入)。然后把它转化为byte[],再转化为一个Stream。并攻取一个路径path。

    WriteableBitmap转byte[]好像不行,现在只找到将WriteableBitmap一个一个像素扫描出来,遇到大尺寸,性能问题严重,

    2011年8月29日 7:59
  • 你好,

    WriteableBitmap转byte[]是可以的。

    一种方法是用 Convert.FromBase64String(string)方法。

    所以你要做的是把WriteableBitmap转化成一个string(可以在网上搜一下,会有相关的资料。)


    Daoping Liu - MSFT
    2011年8月31日 2:03
    版主
  • private static string GetBase64Jpg(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, 90, 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; 
       
    } 

    这个就是将将WriteableBitmap一个一个像素扫描,大尺寸的时候需要很长时间。

    2011年8月31日 9:28
  • 希望产品组在silverlight5里面提供一个内置的方法就好了.

    还有就是文字描边功能

    http://msdn.microsoft.com/en-us/library/ms745816.aspx

    虽然可以实现,但是需要在服务端生成,要是在客户端就可以直接描边就好了

    2011年8月31日 9:31
  • 这里有一个我负责开发silverlight产品,在线图片编辑器,有很多建议和意见,想反映给silverlight产品组。
    www.mayibang.com
    http://www.mayibang.com/imgmaker.php?id=1828
    2011年8月31日 9:33