Skip to content
This repository was archived by the owner on Dec 21, 2023. It is now read-only.
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 30 additions & 27 deletions src/Microsoft.Maui.Graphics.Skia/SkiaImage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,38 +100,41 @@ public IImage Resize(float width, float height, ResizeMode resizeMode = ResizeMo

public void Save(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1)
{
throw new NotImplementedException();
// todo: implement me
var skStream = GetSkStream(format, quality);

/*
switch (format)
{
case ImageFormat.Jpeg:
image.Compress (Bitmap.CompressFormat.Jpeg, (int)(quality * 100), stream);
break;
default:
image.Compress (Bitmap.CompressFormat.Png, 100, stream);
break;
}
*/
using (skStream)
{
skStream.CopyTo(stream);
}
}

public Task SaveAsync(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1)
public async Task SaveAsync(Stream stream, ImageFormat format = ImageFormat.Png, float quality = 1)
{
throw new NotImplementedException();
// todo: implement me
var skStream = GetSkStream(format, quality);
using (skStream)
{
await skStream.CopyToAsync(stream);
}
}

/*
switch (format)
{
case ImageFormat.Jpeg:
await image.CompressAsync (Bitmap.CompressFormat.Jpeg, (int)(quality * 100), stream);
break;
default:
await image.CompressAsync (Bitmap.CompressFormat.Png, 100, stream);
break;
}
*/
private Stream GetSkStream(ImageFormat format, float quality)
{
// Skia quality range from 0-100, this is supported by jpeg and webp. Higher values correspond to improved visual quality, but less compression.
const int MaxSKQuality = 100;
var skQuality = (int)(MaxSKQuality * quality);
SKEncodedImageFormat skEncodedImageFormat = format switch
{
ImageFormat.Png => SKEncodedImageFormat.Png,
ImageFormat.Jpeg => SKEncodedImageFormat.Jpeg,
ImageFormat.Bmp => SKEncodedImageFormat.Bmp,
ImageFormat.Gif => SKEncodedImageFormat.Gif,
ImageFormat.Tiff => throw new PlatformNotSupportedException($"Do not support Tiff format in Skia"),
_ => throw new ArgumentOutOfRangeException(nameof(format), format, null)
};

var skData = _image.Encode(skEncodedImageFormat, skQuality);
var skStream = skData.AsStream(streamDisposesData: true);
return skStream;
}

public void Dispose()
Expand Down