背景:我正在开发一个silverlight(1.0)应用程序,该应用程序动态构建美国地图,图标和文本覆盖在特定位置.该地图在浏览器中运行良好,现在我需要获得显示地图的静态(可打印和可插入文档/ powerpoint)副本.
目标:为了获得地图的可打印副本,也可以在powerpoint幻灯片,单词等中使用.我选择创建一个ASP.NET HttpHandler来在WPF中重新创建服务器端的xaml,然后渲染WPF到位图图像,作为png文件返回,以300dpi生成,以获得更好的打印质量.
问题:这对一个问题很有效,我无法将图像缩放到指定的大小.我尝试了几种不同的东西,其中一些可以在注释掉的行中看到.我需要能够指定图像的高度和宽度,以英寸或像素为单位,我不一定关心哪个,并且生成的位图具有xaml缩放到该大小.目前,如果我将大小设置为大于根画布,则画布将以指定大小在生成图像的左上角以其原始大小进行渲染.以下是我的httphandler的重要部分.存储为"MyImage"的根画布的高度为600,宽度为800.为了使内容扩展到符合指定的大小,我缺少什么?
我不完全理解传递给Arrange()和Measure()的维度是什么,因为这些代码是从在线示例中获取的.我也不完全了解RenderTargetBitmap的东西.任何指导将不胜感激.
Public Sub Capture(ByVal MyImage As Canvas)
' Determine the constraining scale to maintain the aspect ratio and the bounds of the image size
Dim scale As Double = Math.Min(Width / MyImage.Width, Height / MyImage.Height)
'Dim vbox As New Viewbox()
'vbox.Stretch = Stretch.Uniform
'vbox.StretchDirection = StretchDirection.Both
'vbox.Height = Height * scale * 300 / 96.0
'vbox.Width = Width * scale * 300 / 96.0
'vbox.Child = MyImage
Dim bounds As Rect = New Rect(0, 0, MyImage.Width * scale, MyImage.Height * scale)
MyImage.Measure(New Size(Width * scale, Height * scale))
MyImage.Arrange(bounds)
'MyImage.UpdateLayout()
' Create the target bitmap
Dim rtb As RenderTargetBitmap = New RenderTargetBitmap(CInt(Width * scale * 300 / 96.0), CInt(Height * scale * 300 / 96.0), 300, 300, PixelFormats.Pbgra32)
' Render the image to the target bitmap
Dim dv As DrawingVisual = New DrawingVisual()
Using ctx As DrawingContext = dv.RenderOpen()
Dim vb As New VisualBrush(MyImage)
'Dim vb As New VisualBrush(vbox)
ctx.DrawRectangle(vb, Nothing, New Rect(New System.Windows.Point(), bounds.Size))
End Using
rtb.Render(dv)
' Encode the image in the format selected
Dim encoder As System.Windows.Media.Imaging.BitmapEncoder
Select Case Encoding.ToLower
Case "jpg"
encoder = New System.Windows.Media.Imaging.JpegBitmapEncoder()
Case "png"
encoder = New System.Windows.Media.Imaging.PngBitmapEncoder()
Case "gif"
encoder = New System.Windows.Media.Imaging.GifBitmapEncoder()
Case "bmp"
encoder = New System.Windows.Media.Imaging.BmpBitmapEncoder()
Case "tif"
encoder = New System.Windows.Media.Imaging.TiffBitmapEncoder()
Case "wmp"
encoder = New System.Windows.Media.Imaging.WmpBitmapEncoder()
End Select
encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(rtb))
' Create the memory stream to save the encoded image.
retImageStream = New System.IO.MemoryStream()
encoder.Save(retImageStream)
retImageStream.Flush()
retImageStream.Seek(0, System.IO.SeekOrigin.Begin)
MyImage = Nothing
End Sub
Run Code Online (Sandbox Code Playgroud)
Don*_*lle 13
这应该足以让你入门:
private void ExportCanvas(int width, int height)
{
string path = @"c:\temp\Test.tif";
FileStream fs = new FileStream(path, FileMode.Create);
RenderTargetBitmap renderBitmap = new RenderTargetBitmap(width,
height, 1/300, 1/300, PixelFormats.Pbgra32);
DrawingVisual visual = new DrawingVisual();
using (DrawingContext context = visual.RenderOpen())
{
VisualBrush brush = new VisualBrush(MyCanvas);
context.DrawRectangle(brush,
null,
new Rect(new Point(), new Size(MyCanvas.Width, MyCanvas.Height)));
}
visual.Transform = new ScaleTransform(width / MyCanvas.ActualWidth, height / MyCanvas.ActualHeight);
renderBitmap.Render(visual);
BitmapEncoder encoder = new TiffBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
encoder.Save(fs);
fs.Close();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13232 次 |
| 最近记录: |