如何保存具有特定旋转值的旋转图像

4
我需要帮助在UWP中保存旋转后的图像。代码是用C#编写的。旋转是通过滑块完成的,旋转值是特定值(不是90、180、270)。 以下是我的代码:
<Image 
    Name="RotatingImage" 
    Margin="0,100,500,100" 
    HorizontalAlignment="Right" 
    VerticalAlignment="Center" 
    RenderTransformOrigin="0.5,0.5" 
    Stretch="Uniform" 
    Tapped="RotatingImage_Tapped">
    <Image.RenderTransform>
        <!-- That's the part which I've added, on top of the auto-generated xaml -->
        <RotateTransform  />
        <!-- because the ThumbnailImageStyle defines width and height as 228 -->
     </Image.RenderTransform>
</Image>
<Slider 
    x:Name="rotationSlider" 
    Maximum="360" 
    Margin="1058,120,82,0" 
    VerticalAlignment="Top" 
    ValueChanged="RotationSlider_ValueChanged" />

C#

private void RotationSlider_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
    Slider slider = sender as Slider;
    if (slider != null)
    {
        RotationAngle = (int)slider.Value;
    }

    RotatingImage.RenderTransform = new RotateTransform
    {
        Angle = RotationAngle
    };
}

你的问题有点不清楚。你是想将生成的图像保存为文件吗?还是在屏幕上旋转图像并显示它,你是在询问如何实现这个功能? - Adam McMahon
我的问题是如何保存旋转后的图像。 - H. Stepan
3个回答

0
将图像放入名为imageGrid的网格中,将网格的背景设置为透明。 然后尝试以下代码:
        InMemoryRandomAccessStream newStream = new InMemoryRandomAccessStream();

        RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
        await renderTargetBitmap.RenderAsync(this.imageGrid);
        var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, newStream);
        encoder.SetPixelData(
            BitmapPixelFormat.Bgra8,
            BitmapAlphaMode.Straight,
            (uint)renderTargetBitmap.PixelWidth,
            (uint)renderTargetBitmap.PixelHeight,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            DisplayInformation.GetForCurrentView().LogicalDpi,
            pixelBuffer.ToArray());
        await encoder.FlushAsync();

然后您可以保存该流。 希望这能帮到您。


0
如上所述,首先您需要将图像放置在网格或画布中。 然后,请尝试以下代码片段。
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
await renderTargetBitmap.RenderAsync(MyGrid, MyGrid.ActualWidth, MyGrid.ActualHeight);
var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
var pixels = pixelBuffer.ToArray();
var displayInformation = DisplayInformation.GetForCurrentView();

var folder = await ApplicationData.Current.LocalFolder.CreateFolderAsync("Images", CreationCollisionOption.OpenIfExists);
var file = await folder.CreateFileAsync("RotatedImage" + ".png", CreationCollisionOption.ReplaceExisting);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
    var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
    encoder.BitmapTransform.InterpolationMode = BitmapInterpolationMode.Cubic;
    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied, (uint)renderTargetBitmap.PixelWidth, (uint)renderTargetBitmap.PixelHeight, displayInformation.RawDpiX, displayInformation.RawDpiY, pixels);
    await encoder.FlushAsync();
}

这将把图像保存到名为“Images”的文件夹中,该文件夹位于您的包的LocalFolder中。


-1
使用RenderTargetBitmap保存当前视图。
例如,
RenderTargetBitmap bmp = new RenderTargetBitmap({Width}, {Height}, {DpiX}, {DpiY}, PixelFormats.Default);
bmp.Render({ControlWhichYouWantToSave});

PngBitmapEncoder encoder = new PngBitmapEncoder();
encover.Frames.Add(BitmapFrame.Create(bmp));

using ( FileStream fs = File.Open({Location}, FileMode.Create)) 
{
    encoder.Save(fs);
    fs.Close();
}

如果这个不起作用,就改变它。
bmp.Render({ControlWhichYouWantToSave}); 

作为

bmp.Render({ContrplParentWhichYouWantToSave});

希望这能够工作。

通常我使用 Grid 完成这件事。因此,我将 Grid 渲染为图像(目标网格的子元素)以保存图像。 - Arphile
我能保存为图片吗? - H. Stepan
RenderTargetBitmap不包含接受参数的构造函数。 - H. Stepan
我认为“拍摄”UI元素并不是最好的方法...我们应该寻找一些在保存时旋转图像本身的方法。 - Luca Lindholm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接