Skip to content

Commit

Permalink
MagickImage ToWriteableBitmap();
Browse files Browse the repository at this point in the history
  • Loading branch information
Ruben2776 committed Jan 8, 2025
1 parent 13a0f1f commit bf64b2a
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 28 deletions.
15 changes: 2 additions & 13 deletions src/PicView.Avalonia/ImageHandling/GetImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,7 @@ public static class GetImage
await magickImage.ReadAsync(fileStream).ConfigureAwait(false);
}

magickImage.Format = MagickFormat.Png;
await using var memoryStream = new MemoryStream();
await magickImage.WriteAsync(memoryStream);
memoryStream.Position = 0;

var bitmap = new Bitmap(memoryStream);
var bitmap = magickImage.ToWriteableBitmap();
return bitmap;
}

Expand All @@ -66,13 +61,7 @@ public static class GetImage
};

await magickImage.ReadAsync(new MemoryStream(base64Data), readSettings).ConfigureAwait(false);

magickImage.Format = MagickFormat.Png;
await using var memoryStream = new MemoryStream();
await magickImage.WriteAsync(memoryStream);
memoryStream.Position = 0;

var bitmap = new Bitmap(memoryStream);
var bitmap = magickImage.ToWriteableBitmap();
magickImage.Dispose();
return bitmap;
}
Expand Down
6 changes: 1 addition & 5 deletions src/PicView.Avalonia/ImageHandling/GetThumbnails.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,7 @@ public static class GetThumbnails

var geometry = new MagickGeometry(0, height);
magick.Thumbnail(geometry);
magick.Format = MagickFormat.Png;
await using var memoryStream = new MemoryStream();
await magick.WriteAsync(memoryStream);
memoryStream.Position = 0;
return WriteableBitmap.Decode(memoryStream);
return magick.ToWriteableBitmap();
}
}

34 changes: 34 additions & 0 deletions src/PicView.Avalonia/ImageHandling/MagickExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System.Runtime.InteropServices;
using Avalonia;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using ImageMagick;

namespace PicView.Avalonia.ImageHandling;

public static class MagickExtensions
{
public static unsafe WriteableBitmap ToWriteableBitmap<TQuantumType>(this IMagickImage<TQuantumType> self)
where TQuantumType : struct, IConvertible
{
var size = new PixelSize((int)self.Width, (int)self.Height);
var dpi = new Vector(96, 96);
var bitmap = new WriteableBitmap(size, dpi, PixelFormats.Rgba8888, AlphaFormat.Unpremul);

using var framebuffer = bitmap.Lock();
using var pixels = self.GetPixelsUnsafe();
const string mapping = "RGBA";

var destination = framebuffer.Address;
for (var y = 0; y < self.Height; y++)
{
var bytes = pixels.ToByteArray(0, y, self.Width, 1, mapping);
if (bytes != null)
Marshal.Copy(bytes, 0, destination, bytes.Length);

destination += framebuffer.RowBytes;
}

return bitmap;
}
}
13 changes: 3 additions & 10 deletions src/PicView.Avalonia/Views/EffectsView.axaml.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Media.Imaging;
using ImageMagick;
using PicView.Avalonia.ImageHandling;
using PicView.Avalonia.Navigation;
using PicView.Avalonia.ViewModels;

Expand Down Expand Up @@ -150,11 +150,7 @@ private async Task ApplyEffects(MainViewModel vm)
{
magick.Emboss();
}

await using var memoryStream = new MemoryStream();
await magick.WriteAsync(memoryStream);
memoryStream.Position = 0;
var bitmap = new Bitmap(memoryStream);
var bitmap = magick.ToWriteableBitmap();
vm.ImageSource = bitmap;
}

Expand All @@ -166,10 +162,7 @@ private static async Task RemoveEffects(MainViewModel vm)
magick.BackgroundColor = MagickColors.Transparent;
magick.Settings.BackgroundColor = MagickColors.Transparent;
magick.Settings.FillColor = MagickColors.Transparent;
await using var memoryStream = new MemoryStream();
await magick.WriteAsync(memoryStream);
memoryStream.Position = 0;
var bitmap = new Bitmap(memoryStream);
var bitmap = magick.ToWriteableBitmap();
vm.ImageSource = bitmap;
}
}

0 comments on commit bf64b2a

Please sign in to comment.