Browse Source

Add createscaled bitmap

pull/3890/head
Dan Walmsley 7 years ago
parent
commit
0889318c57
  1. 6
      src/Avalonia.Visuals/Media/Imaging/Bitmap.cs
  2. 2
      src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs
  3. 14
      src/Skia/Avalonia.Skia/ImmutableBitmap.cs
  4. 12
      src/Skia/Avalonia.Skia/PlatformRenderInterface.cs
  5. 5
      src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs

6
src/Avalonia.Visuals/Media/Imaging/Bitmap.cs

@ -23,6 +23,12 @@ namespace Avalonia.Media.Imaging
return new Bitmap(factory.LoadBitmapToHeight(stream, height, interpolationMode));
}
public static Bitmap CreateScaledBitmap(Bitmap src, PixelSize destinationSize, BitmapInterpolationMode interpolationMode = BitmapInterpolationMode.HighQuality)
{
IPlatformRenderInterface factory = AvaloniaLocator.Current.GetService<IPlatformRenderInterface>();
return new Bitmap(factory.ResizeBitmap(src.PlatformImpl.Item, destinationSize, interpolationMode));
}
/// <summary>
/// Initializes a new instance of the <see cref="Bitmap"/> class.
/// </summary>

2
src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs

@ -114,6 +114,8 @@ namespace Avalonia.Platform
/// <returns>An <see cref="IBitmapImpl"/>.</returns>
IBitmapImpl LoadBitmapToHeight(Stream stream, int height, BitmapInterpolationMode interpolationMode = BitmapInterpolationMode.HighQuality);
IBitmapImpl ResizeBitmap(IBitmapImpl bitmapImpl, PixelSize destinationSize, BitmapInterpolationMode interpolationMode = BitmapInterpolationMode.HighQuality);
/// <summary>
/// Loads a bitmap implementation from a pixels in memory.
/// </summary>

14
src/Skia/Avalonia.Skia/ImmutableBitmap.cs

@ -40,6 +40,20 @@ namespace Avalonia.Skia
}
}
public ImmutableBitmap(ImmutableBitmap src, PixelSize destinationSize, BitmapInterpolationMode interpolationMode)
{
SKImageInfo info = new SKImageInfo(destinationSize.Width, destinationSize.Height, SKColorType.Bgra8888);
SKImage output = SKImage.Create(info);
src._image.ScalePixels(output.PeekPixels(), interpolationMode.ToSKFilterQuality());
_image = output;
PixelSize = new PixelSize(_image.Width, _image.Height);
// TODO: Skia doesn't have an API for DPI.
Dpi = new Vector(96, 96);
}
// NOTE, putting the stream before options in the parameters, causes an exception
// inside SKCodec.Create with optimized code. Probably a bug in .net compiler.
// Other option is to have the argument order as desired and use PreserveSig options.

12
src/Skia/Avalonia.Skia/PlatformRenderInterface.cs

@ -109,6 +109,18 @@ namespace Avalonia.Skia
return new ImmutableBitmap(size, dpi, stride, format, data);
}
public IBitmapImpl ResizeBitmap(IBitmapImpl bitmapImpl, PixelSize destinationSize, BitmapInterpolationMode interpolationMode = BitmapInterpolationMode.HighQuality)
{
if (bitmapImpl is ImmutableBitmap ibmp)
{
return new ImmutableBitmap(ibmp, destinationSize, interpolationMode);
}
else
{
throw new Exception("Invalid source bitmap type.");
}
}
/// <inheritdoc />
public IRenderTargetBitmapImpl CreateRenderTargetBitmap(PixelSize size, Vector dpi)
{

5
src/Windows/Avalonia.Direct2D1/Direct2D1Platform.cs

@ -201,6 +201,11 @@ namespace Avalonia.Direct2D1
throw new NotImplementedException();
}
public IBitmapImpl ResizeBitmap(IBitmapImpl bitmapImpl, PixelSize destinationSize, BitmapInterpolationMode interpolationMode = BitmapInterpolationMode.HighQuality)
{
throw new NotImplementedException();
}
public IBitmapImpl LoadBitmap(PixelFormat format, IntPtr data, PixelSize size, Vector dpi, int stride)
{
return new WicBitmapImpl(format, data, size, dpi, stride);

Loading…
Cancel
Save