Xamarin旋转用相机捕获的图像



我试图在skiasharp中获得一个图像,该图像左旋转90度以居中并完美地适合画布。我试过两种方法。我自己的定制方式,另一个似乎是一个流行的解决方案,但也许我不明白它是如何正确工作的?

  1. 我行我素

代码如下:

SKSurface surf = e.Surface;
SKCanvas canvas = surf.Canvas;
SKSize size = canvasView.CanvasSize;
canvas.Clear();
SKRect rect = SKRect.Create(0.0f, 0.0f, size.Height, size.Width);
canvas.RotateDegrees(85);
canvas.DrawBitmap(m_bm, rect);

"m_bm"是在单独函数中检索的位图。该函数是:

// Let user take a picture.
var result = await MediaPicker.CapturePhotoAsync(new MediaPickerOptions
{
Title = "Take a picture"
});
// Save stream.
var stream = await result.OpenReadAsync();
// Create the bitmap.
m_bm = SKBitmap.Decode(stream);
// Set to true because the image will be prepared soon.
m_displayedImage = true;

我只放了85而不是90,因为我想从视觉上看到它越来越近,但当我这样做时,它从屏幕上消失了。我具有游戏编程背景,所以这通常是通过获取我们正在处理的任何东西(如游戏中的玩家)的宽度并将其添加到x位置来解决的。但是对于Xamarin,没有效果。这是我自己的尝试。然后我上网寻求帮助,他们给了我一个不同的实现。

  • 流行的解决方案
  • 请看这里这个流行的解决方案,它是这个用户问题的第一个答案。我使用的代码略有不同,因为我没有看到在用户函数中返回图像的意义。

    // Save stream.
    var stream = await result.OpenReadAsync();
    using (var bitmap = SKBitmap.Decode(stream))
    {
    var rotated = new SKBitmap(bitmap.Height, bitmap.Width);
    using (var surface = new SKCanvas(rotated))
    {
    surface.Clear();
    surface.Translate(rotated.Height, rotated.Width);
    surface.RotateDegrees(90);
    surface.DrawBitmap(bitmap, 0, 0);
    }
    }
    

    我正在用画布绘制位图,我认为这会起作用,因为在其他代码样本中测试它,它确实是这样做的,所以我肯定没有正确旋转或什么?

    @Cheesebaron在回复原始帖子时给我的链接最终成功了。但是一个新的问题出现了,我自己去谷歌一下。下面是我自己的代码:

    namespace BugApp
    {
    
    public partial class MainPage : ContentPage
    {
    // Save bitmaps for later use.
    static SKBitmap m_bm;
    static SKBitmap m_editedBm;
    // Boolean for displaying the image captured with the camera.
    bool m_displayedImage;
    
    public MainPage()
    {
    // Set to explicit default values to always be in control of the assignments.
    m_bm = null;
    m_editedBm = null;
    // No picture has been taken yet.
    m_displayedImage = false;
    InitializeComponent();
    }
    // Assigned to the button in the xaml page.
    private async void SnapPicture(Object sender, System.EventArgs e)
    {
    // Let user take a picture.
    var result = await MediaPicker.CapturePhotoAsync(new MediaPickerOptions
    {
    Title = "Take a picture"
    });
    // Save stream.
    var stream = await result.OpenReadAsync();
    // Create the bitmap.
    m_bm = SKBitmap.Decode(stream);
    // Get the rotated image.
    m_editedBm = Rotate();
    // Set to true because the image will be prepared soon.
    m_displayedImage = true;
    }
    public static SKBitmap Rotate()
    {
    using (var bitmap = m_bm)
    {
    var rotated = new SKBitmap(bitmap.Height, bitmap.Width);
    using (var surface = new SKCanvas(rotated))
    {
    surface.Translate(bitmap.Width, 0);
    surface.RotateDegrees(90);
    surface.DrawBitmap(bitmap, 0, 0);
    }
    return rotated;
    }
    }
    private void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs e)
    {
    if(m_bm != null && m_displayedImage == true)
    {
    e.Surface.Canvas.Clear();
    // Draw in a new rect space.
    e.Surface.Canvas.DrawBitmap(m_editedBm, new SKRect(0.0f, 0.0f, 300.0f, 300.0f));
    // ---Testing.
    // e.Surface.Canvas.DrawBitmap(m_editedBm, new SKRect(112, 238, 184, 310), new SKRect(0, 0, 9, 9));
    
    // Avoid having this function launch again for now.
    m_displayedImage = false;
    }
    }
    }
    

    }

    重要的代码部分是rotate函数,也就是下面这个:

    感谢所有回复的人。

    相关内容

    • 没有找到相关文章

    最新更新