You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:30:49