wpf 旋转可写位图而不创建新位图

zz2j4svz  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(158)

好了,这是如何工作的:

  1. camera作为可写位图客户端向我发送图像。WhenMasterFrameCaptured().ObserveOn(SynchronizationContext.Current).Subscribe(frame =〉UpdateMasterCameraPreview(frame));
    1.我在它订阅的方法中设置了指向图像源(wpfImage控件)的指针
if (cameraOneBitmap != null)
        {
            frame.Image.CopyTo(cameraOneBitmap);

        }

        else
        {
            cameraOneBitmap = frame.Image.ToWriteableBitmap();
        }

        cameraOneBitmap.Lock();
        cameraOneBitmap.AddDirtyRect(new Int32Rect(0, 0, cameraOneBitmap.PixelWidth, cameraOneBitmap.PixelHeight));
        cameraOneBitmap.Unlock();

        cameraOneImage.Source = cameraOneBitmap;

问题:这个方法给我一个Angular 不正确的位图,我没有办法改变它。我必须旋转它。我目前正在使用xaml中的渲染转换。问题是它在某些窗口大小中使图像变得奇怪,它悬挂在窗口底部的网格上,所以我不想使用它。我试过使用writeablebitmapex库,但它创建了一个新的位图,这给了我一个内存不足的异常,在大约10秒...有没有一种方法来旋转这个位图,而不必每次都制作一个新的?不知何故,渲染转换没有给我带来问题。我这样做是为了设置源代码,但它仍然给我一个异常,因为它使一个新的。

public static RenderTargetBitmap RotateImage(double angle, WriteableBitmap sourceBitmap)
{
    TransformedBitmap tb = new TransformedBitmap(sourceBitmap, new RotateTransform(angle));
    DrawingVisual drawingVisual = new DrawingVisual();
    DrawingContext drawingContext = drawingVisual.RenderOpen();
    drawingContext.DrawImage(tb, new Rect(0, 0, tb.PixelWidth, tb.PixelHeight));

    //drawingContext.PushTransform(new RotateTransform(270, .5, .5));
    drawingContext.Close();

    System.Windows.Media.Imaging.RenderTargetBitmap bmp = new System.Windows.Media.Imaging.RenderTargetBitmap(tb.PixelWidth, tb.PixelHeight, 96, 96, PixelFormats.Pbgra32);
    bmp.Render(drawingVisual);

    return bmp;
}
nmpmafwu

nmpmafwu1#

我相信你已经继续前进了,但为了子孙后代,解决方案是使用LayoutTransform而不是RenderTransform
当你使用RenderTransform时,所有的布局计算都是在你的元素不旋转的情况下执行的。然后应用RenderTransform。
LayoutTransform执行旋转,然后计算布局。

相关问题