如何在Silverlight 3.0中使用SaveFileDialog保存BitmapImage / WriteableBitmap?

3
如何将Silverlight中的WriteableBitmap保存到文件系统?我不确定如何使用FileStream使其工作,可以使用Bitmap、PNG、Jpeg等格式,只要不需要商业库即可。
这个有可能吗?
以下是我的SaveDialog调用:
    Dim SaveDialog As New SaveFileDialog
    If SaveDialog.ShowDialog Then
        Try
            Using FileStream As Stream = SaveDialog.OpenFile
               ' Save Image File Code Here
            End Using
        Catch ex As Exception

        End Try
    End If

编辑

增加了对WritableBitmap的提及,因为这是我的XAML正在写入的内容,我只需要保存它。WriteableBitmap.Pixels属性是一个整数像素的一维数组,这个数组能否放入文件流中?如果可以,怎么做呢?


下面是我编写的一些示例代码,用于将像素流写入文件。虽然它确实起作用,但它没有"位图化"数据,输出结果是无用的,但它正在写入我的图像流,我只需要知道如何标记它,使其成为位图文件(或其他任何格式)。我以前找到过JPEG和PNG的示例,但它们都没有很好地解释它们的工作原理。也许我必须使用PNGEncoding方法,因为这是唯一能够集成到我的代码库中的方法。但是,是否有一个简单的BMP文件版本可用?

        Dim Image As Imaging.WriteableBitmap = _Style.Image
        Dim Area As Integer = Image.PixelWidth * Image.PixelHeight
        For Raster As Integer = 0 To Area - 1
            Dim Pixel As Integer = Image.Pixels(Raster)
            Dim Bytes() = BitConverter.GetBytes(Pixel And &HFF)
            FileStream.Write(Bytes, 0, 4)
        Next

+1,这是一个非常好的问题。这必须来自BitmapImage有什么原因吗? - AnthonyWJones
我是指WritableBitmap,但如果这是从Silverlight保存图像的方式,则前者适用,但是从Silverlight保存图像的任何方法都可以接受。 - RoguePlanetoid
2个回答

2
这里有几个开源编码器:
FJCore:http://code.google.com/p/fjcore/ Joe Stegman's PNG Encoder: 链接 FreeImage:http://freeimage.sourceforge.net/ 您可以使用其中任何一个来编码各种格式。这是一篇关于保存 WriteableBitmap 的文章: http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2009/03/18/Silverlight-3-_1320_-The-Bitmap-API-_2F00_-WriteableBitmap.aspx 更新:经过更多搜索,看起来由于安全问题,将 WriteableBitmap 保存到文件在 SL3 中受到限制。这里有一个解决方法: 链接 看起来您必须将 Canvas 的内容保存到文件中。您应该能够修改示例以保存 JPEG 或其他格式。

换句话说,需要付出相当大的努力,但在这一切中,我仍然不清楚是否有保存WritabelBitmap的解决方案。 - AnthonyWJones
他们并没有让它变得容易。我从一些旧帖子中了解到,这在SL3 RC中被确定为一个问题,并且微软将“尝试”在RTW中解决它。我没有看到任何明确的答案表明他们是否这样做了,但缺乏这样的指导使我相信他们没有。 - Dave Swersky
我使用了FJCore库,它运行良好,而且这是我希望的主要格式,即使这可能是胡言乱语,从图像流到文件是可能的,这意味着可能有一种方法 - 或许在Silverlight 4.0中会更好? - RoguePlanetoid
我真的希望在SL.Next中能够更加容易地实现它。这将使Silverlight成为一个强大的图像处理平台。 - Dave Swersky

1

这是一个很好的例子,我用它实际上创建了使用FJCore的另存为代码,忘记发布它了,感谢你做到了这一点,因为它可能有助于其他人,并且非常容易将该代码转换为VB,这就是我用来开发需要的应用程序。 - RoguePlanetoid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接