使用C# ImageSharp库读取PNG图片PPI异常问题咨询
问题解答
为什么读取到的PPI是5905?
ImageSharp的Image.Metadata.HorizontalResolution和VerticalResolution属性单位是像素每米(Pixels Per Meter),而你提到的150是像素每英寸(PPI,Pixels Per Inch)。两者转换关系为:1米=39.3701英寸,所以150 PPI × 39.3701 ≈ 5905像素/米,这就是你看到的数值。
如何读取正确的PPI?
将读取到的分辨率数值转换为像素每英寸即可,修改后的代码如下:
uploadedFileName = Path.GetFileNameWithoutExtension(files[0]); string base64Image = files[0]; originalImageData = ConvertBase64ToByteArray(base64Image); var imageData = ConvertBase64ToByteArray(base64Image); using (var image = Image.Load(imageData)) { originalImageWidth = image.Width; originalImageHeight = image.Height; // 将像素每米转换为PPI(像素每英寸) double pixelsPerMeterToInch = 39.3701; var horizontalPPI = image.Metadata.HorizontalResolution / pixelsPerMeterToInch; var verticalPPI = image.Metadata.VerticalResolution / pixelsPerMeterToInch; Console.WriteLine($"Image Width: {originalImageWidth}"); Console.WriteLine($"Image Height: {originalImageHeight}"); Console.WriteLine($"Horizontal PPI: {Math.Round(horizontalPPI, 2)}"); Console.WriteLine($"Vertical PPI: {Math.Round(verticalPPI, 2)}"); }
运行后会得到正确的150 PPI(浮点误差可通过Math.Round处理)。
关于DPI的读取
首先明确:数字图像本身不存在DPI,DPI(每英寸点数)是打印设备的属性,描述输出时每英寸的墨点数量。图像元数据里标注的“DPI”其实就是PPI,是给打印设备的参考值——告诉打印机每英寸应该打印多少像素。
ImageSharp读取的分辨率元数据就是这个参考值,所以用上面的转换方式得到的数值,就是常说的“图像DPI”,本质和PPI是同一个数据,只是叫法不同。
内容的提问来源于stack exchange,提问作者Mark Tait
相关产品推荐
相关产品推荐

