带旋转的WPF WriteableBitmap(列主要到行主要)

时间:2012-05-26 14:46:48

标签: c# wpf image-processing

我有自定义图像格式的原始数据(可以更改),它以列主要顺序存储(在一些二进制标题数据之后)。我将文件读入名为“imageDataBytes”的Byte []。

int XSize = 1280; // Really the height of the image
int YSize = 2048; // Really the width of the image
WriteableBitMap myImage = new WritableBitmap(XSize, YSize, 96, 96, PixelFormats.Gray16, null)
System.Windows.Int32Rect rect = new System.Windows.Int32Rect(0, 0, XSize , YSize);
myImage.WritePixels(rect, customImage.imageDataBytes, stride, customImage.imageOffset);

现在,我在XAML中用

显示
    <Image Grid.Column="0" Grid.Row="1" Cursor="Cursor1.cur"Source="{Binding myImage}" Stretch="None"/>

我需要旋转图像(以纠正字节流中的列主要顺序,但我找不到类似于C#中的IPP的Byte []的数组转换(我在这里没有IPP) 。来自xaml的图像旋转将图像移动到整个地方(而不是围绕中心旋转)。

<Image ... // From above>
    <Image.RenderTransform>
        <RotateTransform CenterX="0.5" CenterY="0.5" Angle="-90"/>
    </Image.RenderTransform>
</Image>

我该怎么办?我错过了某处字节[]的变换吗?当中心设置为0.5时,为什么RotateTransform会移动图像?

请注意,这必须尽可能快,它显然是一个大图像,我试图以10Hz +渲染,这就是为什么nise for-loop Byte数组转换被排除在可能的范围之外。

一如既往地谢谢

〜TMII

1 个答案:

答案 0 :(得分:2)

那是因为你没有围绕物体的中心旋转,而是关于点(0.5,0.5)。 见http://msdn.microsoft.com/en-us/library/system.windows.media.rotatetransform.centerx.aspx

如果您可以访问后面代码中的图像,请手动设置RenderTransform,并将CenterX和CenterY指定为Image.Width / 2.0和Image.Height / 2.0。 您只需在图像更改时执行此操作。