NetCore使用SkiaSharp库对给定路径的图片进行大小缩放,要适当考虑等比率缩放,以高度为准,宽度自适应

发布时间 2023-11-26 21:50:55作者: pccai

SkiaSharp库是跨平台的2D图片操作库,在夸平台方面比较稳定,且支持常用的“windows操作”:缩放,剪裁,格式转换等。

例如:如果要按照原始图片高度为准,自动调整宽度进行等比例缩放,可以根据以下步骤使用SkiaSharp库进行操作:

  1. 导入SkiaSharp命名空间:
using SkiaSharp;
  1. 加载原始图像:
string filePath = "path/to/image.png"; // 图像文件的路径

// 使用SKBitmap加载原始图像
SKBitmap originalBitmap = SKBitmap.Decode(filePath);
  1. 计算缩放后的目标尺寸:
int targetHeight = 600; // 目标高度

// 计算缩放后的目标宽度,保持纵横比
float aspectRatio = (float)originalBitmap.Height / originalBitmap.Width;
int targetWidth = (int)(targetHeight / aspectRatio);

// 创建缩放后的目标尺寸
SKSizeI targetSize = new SKSizeI(targetWidth, targetHeight);
  1. 创建缩放后的图像:
// 创建缩放后的SKBitmap对象
SKBitmap scaledBitmap = new SKBitmap(targetSize.Width, targetSize.Height);

// 使用SKCanvas将原始图像绘制到缩放后的图像上
using (SKCanvas canvas = new SKCanvas(scaledBitmap))
{
    // 使用SKPaint进行绘制设置,如保持纵横比、插值质量等
    using (SKPaint paint = new SKPaint())
    {
        // 设置插值质量为高质量
        paint.FilterQuality = SKFilterQuality.High;

        // 计算绘制的矩形区域,保持纵横比
        float scaledWidth = targetHeight / aspectRatio;
        float scaledHeight = targetHeight;
        float x = (targetSize.Width - scaledWidth) / 2;
        float y = 0;
        SKRect destRect = SKRect.Create(x, y, scaledWidth, scaledHeight);

        // 绘制原始图像到缩放后的图像上
        canvas.DrawBitmap(originalBitmap, destRect, paint);
    }
}

现在,scaledBitmap就是按照高度为准,自动调整宽度进行等比例缩放后的图像。你可以根据需要进行进一步的操作,如保存到文件或显示在界面上。

请注意,上述代码假设原始图像的高度大于0,以避免除以零的错误。在实际应用中,你可能还需要添加适当的错误处理和边界条件检查。

扩展

要将缩放后的图像保存到磁盘或返回文件流,你可以使用SkiaSharp的功能来实现。下面是分别保存到磁盘和返回文件流的示例代码:

保存到磁盘:

string filePath = "path/to/image.png"; // 保存图像的文件路径

// 保存缩放后的图像到磁盘
using (var outputStream = File.OpenWrite(filePath))
{
    // 将SKBitmap编码为PNG格式并保存到输出流
    scaledBitmap.Encode(SKEncodedImageFormat.Png, 100).SaveTo(outputStream);
}

返回文件流:

// 创建一个MemoryStream来保存图像数据
using (var memoryStream = new MemoryStream())
{
    // 将SKBitmap编码为PNG格式并保存到内存流
    scaledBitmap.Encode(SKEncodedImageFormat.Png, 100).SaveTo(memoryStream);

    // 将内存流的位置重置为起始位置
    memoryStream.Seek(0, SeekOrigin.Begin);

    // 现在你可以使用memoryStream进行进一步的操作,如传输到客户端或保存到数据库等
    // 返回memoryStream或执行其他操作
}

以上代码示例假设你已经完成了缩放操作并获得了scaledBitmap对象。根据需要,你可以调整保存的图像格式(这里使用PNG格式)和压缩质量(这里使用100表示无损压缩)。

提示

在SkiaSharp库中,可以使用以下方法在SKImageSKBitmap对象之间进行相互转换:

  1. SKImageSKBitmap的转换:
SKImage skImage = ...; // 要转换的SKImage对象

// 创建一个空的SKBitmap对象
SKBitmap skBitmap = new SKBitmap(skImage.Width, skImage.Height);

// 将SKImage绘制到SKBitmap上
using (SKCanvas canvas = new SKCanvas(skBitmap))
{
    canvas.Clear(SKColors.Transparent);
    canvas.DrawImage(skImage, SKPoint.Empty);
}
  1. SKBitmapSKImage的转换:
SKBitmap skBitmap = ...; // 要转换的SKBitmap对象

// 将SKBitmap转换为SKImage
SKImage skImage = SKImage.FromBitmap(skBitmap);

请注意,这些转换可能会导致内存和性能方面的开销,特别是在处理大尺寸的图像时。确保在使用完对象后及时释放资源(比如默认都使用using),以避免内存泄漏。