NetCore使用SkiaSharp库对给定路径的图片进行大小缩放,要适当考虑等比率缩放,以高度为准,宽度自适应
SkiaSharp库是跨平台的2D图片操作库,在夸平台方面比较稳定,且支持常用的“windows操作”:缩放,剪裁,格式转换等。
例如:如果要按照原始图片高度为准,自动调整宽度进行等比例缩放,可以根据以下步骤使用SkiaSharp库进行操作:
- 导入SkiaSharp命名空间:
using SkiaSharp;
- 加载原始图像:
string filePath = "path/to/image.png"; // 图像文件的路径
// 使用SKBitmap加载原始图像
SKBitmap originalBitmap = SKBitmap.Decode(filePath);
- 计算缩放后的目标尺寸:
int targetHeight = 600; // 目标高度
// 计算缩放后的目标宽度,保持纵横比
float aspectRatio = (float)originalBitmap.Height / originalBitmap.Width;
int targetWidth = (int)(targetHeight / aspectRatio);
// 创建缩放后的目标尺寸
SKSizeI targetSize = new SKSizeI(targetWidth, targetHeight);
- 创建缩放后的图像:
// 创建缩放后的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库中,可以使用以下方法在SKImage
和SKBitmap
对象之间进行相互转换:
- 从
SKImage
到SKBitmap
的转换:
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);
}
- 从
SKBitmap
到SKImage
的转换:
SKBitmap skBitmap = ...; // 要转换的SKBitmap对象
// 将SKBitmap转换为SKImage
SKImage skImage = SKImage.FromBitmap(skBitmap);
请注意,这些转换可能会导致内存和性能方面的开销,特别是在处理大尺寸的图像时。确保在使用完对象后及时释放资源(比如默认都使用using),以避免内存泄漏。
msn: pccai1983@hotmail.com