【发布时间】:2016-02-28 02:28:42
【问题描述】:
好的,我试过了:
TransformedBitmap tbm = new TransformedBitmap(myBitmapSource, new RotateTransform(angle));
return tbm;
但这不适用于除 90 度的倍数以外的角度。
新我尝试使用 RenderTargetBitmap:
var image = new Canvas();
image.Width = myBitmapSource.PixelWidth;
image.Height = myBitmapSource.PixelHeight;
image.Background = new ImageBrush(myBitmapSource);
image.RenderTransform = new RotateTransform(angle);
RenderTargetBitmap rtb = new RenderTargetBitmap(myBitmapSource.PixelWidth, myBitmapSource.PixelHeight, myBitmapSource.DpiX, myBitmapSource.DpiY, myBitmapSource.Format);
rtb.Render(image);
return rtb;
但这给了我:
"The calling thread must be STA, because many UI components require this."
这在没有 GUI 的服务中运行。
谁能给我一个工作代码示例,说明如何在 WPF(没有 GUI)中将 BitmapSource 旋转任意角度?
更新:
【问题讨论】:
-
如果您在运行代码的线程上调用
SetApartmentState(ApartmentState.STA),它应该可以工作。但是请注意,您必须以某种方式计算 resultimg 位图的正确大小。否则部分源位图可能会被截断。此外,您可能希望围绕图像中心旋转,因此您应该设置image.RenderTransformOrigin = new Point(0.5, 0.5)。最后,必须在 Canvas 上进行布局,即您必须调用其Measure和Arrange方法。 -
问题是我无法设置,因为我是插件
-
然后创建一个新线程,在那里进行处理并将结果传递回您的插件线程。不要忘记在结果位图上调用
Freeze()以使其可以跨线程访问。 -
@Clemens 使用 RenderTransform 还是 LayoutTransform 更好? (区别在哪里?)
-
你没有做任何布局,所以 RenderTransform 就足够了。阅读 MSDN 上的差异。
标签: c# wpf bitmapsource