简体   繁体   中英

How to save rotated image with specific rotation value

I need help with saving rotated image in uwp. The code is in C#. The rotation is made by slider and the rotation value is a specific value(not 90,180,270). This is my code

<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
    };
}

Put the image in a grid named imageGrid, set the grid's background to Transparent. Then try below code:

        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();

Then you can save the stream. Hope this can help you.

As has been said above, first you will need to place the image in a Grid or a Canvas. Then, try the following snippet.

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();
}

This will save the image into a folder named "Images" within your packages LocalFolder.

Use RenderTargetBitmap to save current view.

for example,

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();
}

if this doesn't work, change

bmp.Render({ControlWhichYouWantToSave}); 

as

bmp.Render({ContrplParentWhichYouWantToSave});

hope this work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM