0

每个WPF 图像控件都有RenderTransform属性,该属性将ScaleSkewRotate和更多的 Transformation 设置为图像。调用RenderTransform属性后,如何将渲染图像放入BitmapImageRenderTargetBitmap类或任何其他类?

这是我的代码:

Dim InImage As New BitmapImage(New Uri("My Image Path"))

Dim TG As New TransformGroup
TG.Children.Add(New RotateTransform(190))

Dim MyImg As New Image
MyImg.Source = InImage
MyImg.RenderTransform = TG

'Here i need get Transformed Image into a BitmapImage or RenderTargetBitmap Variable  or Any other class variable.
4

1 回答 1

2

遗憾的是,TransformedBitmap它不支持以 90 度的任何倍数以外的角度旋转(这意味着我们只能旋转 90、180、270,...)。考虑我们可以将哪些对象放入位图中并应用一些Transform?好吧,我们有DrawingGroup, DrawingVisual,和 via 。ImageBrushUIElementDrawingContext

  • 使用,我们必须通过 的属性DrawingGroup放入ImageDrawing并应用变换。然后我们要使用 a ,将属性设置为。TransformDrawingGroupDrawingImageDrawingDrawingGroup

  • 使用DrawingVisual,我们必须打开一个DrawingContext,使用DrawImage推一些变换后的方法。然后我们可能不得不RenderTargetBitmap通过DrawingVisualRender方法中传递来使用。

  • 使用UIElement(就像您关于使用控件作为媒介的想法Image),我们必须在UIElement. 所以Image控制最适合这个。每个UIElement都有一个Transform属性,允许我们添加任何变换。最后,我们还必须RenderTargetBitmap通过UIElementRender方法中传递 a 来使用。

  • 使用ImageBrush,我们必须将ImageSource属性设置为BitmapImage。然后我们可以使用TransformorRelativeTransform属性来应用一些变换。之后我们必须使用DrawingImage. 创建一个简单GeometryDrawing的使用ImageBrush作为它的画笔,和一个RectangleGeometry作为它的几何。最后,我们只需要将其设置GeometryDrawing为. 输出是. 我想用这种方法在这里写代码:DrawingDrawingImageDrawingImage

    Dim InImage As New BitmapImage(New Uri("My Image Path"))
    Dim ImgBrush As New ImageBrush(InImage)
    ImgBrush.Viewport = New Rect(0.1,0.1,0.8,0.8)
    ImgBrush.ViewportUnits = BrushMappingMode.RelativeToBoundingBox
    Dim Rotating As New RotateTransform(190)
    Rotating.CenterX = 0.5
    Rotating.CenterY = 0.5
    ImgBrush.RelativeTransform = Rotating
    
    Dim ImgSize As New Rect(0,0,300,400)
    Dim DrawImage As New DrawingImage()
    DrawImage.Drawing = New GeometryDrawing(ImgBrush, null, ImgSize)
    

关于"My Image Path". 我发现Relative如果您没有与构建的 exe 文件处于同一级别的任何 Image 文件夹,则使用图像将不起作用。如果您不想将某些图像文件夹与您的应用程序一起部署,您可以将图像添加为Resource。要在后面的代码中引用作为资源添加的图像,您必须使用一种特殊的路径:

pack://application:,,,/Your_Relative_Image_Path

请注意,要确保您的图像被添加为资源,请尝试右键单击图像(在 Projects 树视图下),在弹出菜单中选择Properties ,然后查看Build Action字段,它应该是Resource

还要注意ImgBrush.Viewport, 适当地设置它会防止图像被切断(那是因为转换后的图像被旋转了)。这取决于ImgSize您旋转的度数和度数。

于 2014-07-20T13:48:32.970 回答