如何在SkiaSharp中获取HorizontalResolution与VerticalResolution?
解决方案:SkiaSharp中获取图片分辨率并缩放SKPicture
核心原因
SKPicture是SkiaSharp中存储矢量绘制指令的对象,本身不包含DPI/分辨率元数据——它只记录绘制坐标与操作,CullRect仅表示绘制内容的边界尺寸(逻辑像素单位)。要获取分辨率,需从原始图片文件的EXIF信息读取,或手动指定。
方案1:从原始图片文件读取EXIF分辨率
如果你的SKPicture由图片文件(如PNG/JPG)序列化而来,可通过SKCodec读取文件EXIF数据获取DPI:
// 先读取原始图片文件的EXIF分辨率 float horizontalDpi = 72f; // 默认印刷行业标准DPI float verticalDpi = 72f; using var codec = SKCodec.Create(filename); var exifData = codec.ExifData; if (exifData != null) { // 解析X/Y分辨率及单位(EXIF中单位:2=英寸,3=厘米) if (exifData.TryGetValue(SKExifTag.XResolution, out float xRes) && exifData.TryGetValue(SKExifTag.ResolutionUnit, out int unit)) { horizontalDpi = unit == 2 ? xRes : xRes * 2.54f; // 厘米转英寸(1英寸=2.54厘米) } if (exifData.TryGetValue(SKExifTag.YResolution, out float yRes) && exifData.TryGetValue(SKExifTag.ResolutionUnit, out int unit)) { verticalDpi = unit == 2 ? yRes : yRes * 2.54f; } } // 处理SKPicture并计算缩放后的尺寸 Stream pictureStream = GetPictureStream(filename); using var skImageStream = new SKManagedStream(pictureStream); using var skPicture = SKPicture.Deserialize(skImageStream); var scaledWidth = skPicture.CullRect.Width / horizontalDpi * 72f; var scaledHeight = skPicture.CullRect.Height / verticalDpi * 72f;
方案2:手动指定分辨率(适用于自定义生成的SKPicture)
如果SKPicture是你通过代码绘制生成的,创建时直接记录对应DPI值,后续计算时直接使用:
// 假设生成SKPicture时使用的DPI是Windows系统默认的96 const float sourceDpi = 96f; // 生成SKPicture示例代码 var recorder = new SKPictureRecorder(); using var canvas = recorder.BeginRecording(new SKRect(0, 0, 1920, 1080)); // ... 执行绘制操作 ... using var skPicture = recorder.EndRecording(); // 计算缩放至72DPI的尺寸 var scaledWidth = skPicture.CullRect.Width / sourceDpi * 72f; var scaledHeight = skPicture.CullRect.Height / sourceDpi * 72f;
方案3:使用默认DPI(无法获取原始信息时)
如果无法从原始文件或生成逻辑中获取分辨率,可根据场景使用行业默认值:
const float defaultSourceDpi = 96f; // 屏幕显示常用默认值 Stream pictureStream = GetPictureStream(filename); using var skImageStream = new SKManagedStream(pictureStream); using var skPicture = SKPicture.Deserialize(skImageStream); var scaledWidth = skPicture.CullRect.Width / defaultSourceDpi * 72f; var scaledHeight = skPicture.CullRect.Height / defaultSourceDpi * 72f;
内容的提问来源于stack exchange,提问作者Arash
相关产品推荐
相关产品推荐

