`
wyf
  • 浏览: 437930 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

"Printing" in Silverlight 3 with WriteableBitmap

阅读更多

One of the high-profile missing features in Silverlight has been Printing support. If you have ever tried to print a web page containing Silverlight content, what you saw on the printed page may be skewed or even missing altogether!  So, what if you wanted to print a portion of your Silverlight screen, or take a “snapshot” image of the Silverlight UI to include in a report or other printable format?

Silverlight 3 can accomplish these scenarios using the WriteableBitmap API. WritableBitmap includes a Render method which can snag all of the pixels of a given UI Element and place them into a buffer for manipulation.
In this demo, I’ll show how to take a “snapshot” of a Silverlight UI screen, upload the image to a web server, and include it in a Report Viewer (RDLC) report. You could easily modify these steps to save the snapshot to an image file on the server, or otherwise manipulate the pixels.
The steps used in the demo are as follows:
1.       Render the Silverlight UI to a WriteableBitmap, passing in the UI Element and an arbitrary Transform. In the code below, the content of a Canvas named cnvSource is rendered to the WriteableBitmap. We pass in an empty TranslateTransform simply because one is required by the constructor:
WriteableBitmap bitmap = new WriteableBitmap(cnvSource, new TranslateTransform());
 2.Convert the WriteableBitmap pixels to a PNG using Joe Stegman's PNG encoder.
EditableImage imageData = new EditableImage(bitmap.PixelWidth, bitmap.PixelHeight);
 
 
for (int y = 0; y < bitmap.PixelHeight; ++y)
{
    for (int x = 0; x < bitmap.PixelWidth; ++x)
    {
 
        int pixel = bitmap.Pixels[bitmap.PixelWidth * y + x];
 
        imageData.SetPixel(x, y,
                    (byte)((pixel >> 16) & 0xFF),
                    (byte)((pixel >> 8) & 0xFF),
                    (byte)(pixel & 0xFF),
                    (byte)((pixel >> 24) & 0xFF)
                    );
 
    }
}
 
Stream pngStream = imageData.GetStream();
 NOTE that this PNG encoder does NOT include compression! This would be a good optimization to add, but also note that the GZipStream class is not present in Silverlight, so you would need to use an outside compression library such as SharpZipLib.

3.At this point, we have the PNG bytes in a stream, and you could take several approaches to get these bytes up to the server – such as using an Http Handler (ASHX). In this demo, we’ll place the bytes into a hidden field on the ASPX page and post the page back to the server  for inclusion in a report. To do this, we’ll translate the PNG bytes into a string using Base64 encoding:

byte[] binaryData = new Byte[pngStream.Length];
long bytesRead = pngStream.Read(binaryData, 0, (int)pngStream.Length);
 
string base64String =
        System.Convert.ToBase64String(binaryData,
                                      0,
                                      binaryData.Length);
 
// save the encoded PNG bytes to the page
HtmlDocument document = HtmlPage.Document;
HtmlElement txtPNGBytes = document.GetElementById("txtPNGBytes");
txtPNGBytes.SetProperty("value", base64String);
 
// this calls a js function "postBackPrint" which will cause a postback
HtmlPage.Window.CreateInstance("postBackPrint", new string[] { });

 4.Now that we have our bytes up on the server, we can decode them and feed them to a ReportViewer (RDLC) report. This will give us a nicely printed format and the ability to export to PDF:

string bytes64 = Request["txtPNGBytes"];
byte[] imageBytes = System.Convert.FromBase64String(bytes64);
 
 
DSReportPrintImage ds = new DSReportPrintImage();
DataRow drImage = ds.Tables[0].NewRow();
drImage["ImageBytes"] = imageBytes;
ds.Tables[0].Rows.Add(drImage);
 
ReportViewer1.LocalReport.ReportPath = "ReportPrintSilverlight.rdlc";
 
ReportDataSource src = new ReportDataSource("DSReportPrintImage_ImageData", ds.Tables[0]);
ReportViewer1.LocalReport.DataSources.Add(src);
ReportViewer1.LocalReport.Refresh();

 That’s it! I really think this use of WriteableBitmap as a snapshot/print function will be useful in some of my projects that need to capture the current view of the Silverlight application.

 

分享到:
评论

相关推荐

    C# wpf 使用WriteableBitmap渲染视频

    但如果有时候不想依赖D3D时,还有一种方案实现视频的渲染,使用wpf的WriteableBitmap,WriteableBitmap的祖先接口有ImageSource,即可以作为Image的Source显示画面。我们只需往WriteableBitmap中写入图像数据即可...

    WPF利用WriteableBitmap处理图片流视频示例

    在Windows Presentation Foundation (WPF) 中,WriteableBitmap 是一个非常重要的类,它允许开发者将位图作为可写的像素数组来处理。这个类是用于直接操作图像像素,从而实现高效地处理图片和视频流。在本示例中,...

    WriteableBitmap.zip

    3. 显示图像:将 `WriteableBitmap` 设置为 `Image` 控件的 `Source`,即可在 WPF 界面中显示: ```csharp imageControl.Source = bitmap; ``` 二、应用场景 1. **动态图像生成**:由于 `WriteableBitmap` 可以...

    基于Silverlight实现捕捉视频,截图保存到本地的源码例子

    3. WriteableBitmap类:掌握如何通过WriteableBitmap进行截图,并将截图保存为本地文件。 4. 文件系统访问:在Silverlight中,由于安全限制,直接访问本地文件系统有限制,通常需要通过服务器端的配合来实现保存截图...

    Silverlight 如何导出图片

    - **JSONP或CORS**:对于现代浏览器,可以利用JSONP(JSON with Padding)或CORS(Cross-Origin Resource Sharing)来实现跨域访问,但这不适用于Silverlight。 5. **注意事项**: - 考虑到Silverlight的安全性和...

    WPF下,高性能绘图,写WriteableBitmap,多线程,双缓存

    3. **双缓存策略**:双缓存是一种常见的优化手段,用于提高UI的性能。在这个项目中,可能有两种缓存:一种是后台计算生成的位图,另一种是前台显示的位图。当后台计算完成新图像后,会先将结果存储到一个临时的缓存...

    silverlight摄像头拍照并上传(缩放\裁剪)

    Silverlight中的`WriteableBitmap`类提供了图像像素级别的操作,可以用来实现图片的缩放。通过调整`WriteableBitmap`的宽度和高度,可以对图片进行等比例或非等比例缩放。同时,`RenderTransform`也可以用于图形的...

    Silverlight在线录音示例

    3. **WriteableBitmap**: 虽然主要用于图像处理,但在录音过程中,WriteableBitmap可以用来创建一个临时的音频数据流,以便在录制过程中进行处理或预览。 ### 录音流程 1. **初始化**: 首先,需要检查用户浏览器...

    C#热图生成(三)——with Silverlight改进热图显示

    2. **图形渲染**:Silverlight提供了`WriteableBitmap`类,允许在内存中直接操作像素,这在生成热图时非常有用。通过设置每个像素的颜色,可以构建出整个热图。 3. **动画和交互**:Silverlight的动画系统可以用来...

    silverlight 3.0

    3. **遵循安全性最佳实践**:确保应用程序遵循 Silverlight 的安全沙盒规则,不要尝试执行超出权限的操作。 4. **考虑多设备支持**:在设计应用时考虑不同屏幕尺寸和分辨率的需求,确保应用在各种设备上都能有良好...

    Silverlight调用摄像头

    标题中的“Silverlight调用摄像头”是指在Silverlight应用程序中集成和使用摄像头功能。Silverlight是微软开发的一个浏览器插件,用于创建丰富的、交互式的Web应用程序,它支持多媒体处理,包括音频和视频。在...

    Silverlight Web模式下抓取摄像头内容图片 源代码

    3. **创建VideoBrush**:为了在界面上显示摄像头的实时流,我们需要创建一个`VideoBrush`,并将其`RelativeSource`属性设置为我们的`CaptureSource`。 ```csharp VideoBrush videoBrush = new VideoBrush(); ...

    如何将silverlight中的图片控件保存到文件

    由于Silverlight提供了丰富的图像处理类库,我们可以利用`WriteableBitmap`类来实现这一目标。下面将详细解释整个过程: 1. **选择文件格式**:允许用户选择图片的保存格式(例如BMP、JPEG等)。 2. **获取图片数据...

    silverlight 实现验证码的3种方法

    3. **显示和验证**:将生成的验证码显示在Silverlight应用中,处理用户输入并与服务器端的验证码进行比较。 在实际应用中,可以根据需求选择合适的方法。例如,如果需要高可定制性和更复杂的视觉效果,可以选择基于...

    silverlight程序 截取图片 录制伪视频

    3. `Cmj.MyWeb.MySilverlight`:可能是一个子项目,用于处理Web端与Silverlight应用的交互,例如初始化Silverlight控件、传递参数和接收结果。 4. `SilverlightVideoRecord.Web`:可能是一个ASP.NET Web项目,负责...

    Silverlight 图片上传 下载 显示

    3. Silverlight客户端代码:使用FileUpload控件,监听上传进度,调用WebClient下载图片。 4. 图片处理逻辑:将下载的二进制数据转换为BitmapImage,设置到Image控件中。 5. 可能还有错误处理和异常处理机制,确保...

    Silverlight 摄像头

    在IT领域,Silverlight是一种由微软开发的基于插件的框架,主要用于构建和展示富互联网应用程序(RIA)。本文将深入探讨如何在Silverlight应用程序中启用摄像头功能,以及如何实现截图操作。 首先,让我们理解...

    Silverlight 放大镜查看图片

    Silverlight提供了BitmapImage类用于加载和处理图片,以及WriteableBitmap类用于对图片进行像素级别的操作。 4. **UI布局**:在Silverlight中,使用Canvas或者Grid等布局控件来放置原始图片和放大镜组件,确保它们...

    Silverlight缩略图 图片压缩

    `WriteableBitmap`是Silverlight中用于动态绘制和修改像素的类,它是实现图像处理的关键工具。在描述中提到的`this.RenderThumbnail(bmap)`这段代码,可能是一个自定义方法,用于将传入的`BitmapSource`对象(即`...

    文件,字节,流,BitmapImage和WriteableBitmap之间的转换

    5. **WriteableBitmap**:WriteableBitmap是WPF和Silverlight中的一个可写图像对象,允许直接访问像素数据进行编辑和绘制。这在需要动态更新图像或执行像素操作时非常有用。 以下是一些常见的转换操作: **1. 文件...

Global site tag (gtag.js) - Google Analytics