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

时间:2014-12-13 21:04:00

标签: c# wpf bitmap

好的,这就是它的工作原理:

  1. 相机将图像作为可写位图发送给我  client.WhenMasterFrameCaptured()。ObserveOn(SynchronizationContext.Current).Subscribe(frame => UpdateMasterCameraPreview(frame));

  2. 我在指定的方法中将指针设置为图像源(wpf图像控件)

            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; 
    
  3. 问题:该方法为我提供了一个不是正确角度的位图,我无法改变它。我必须旋转它。我目前在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;
    }
    

0 个答案:

没有答案