2010-10-19 99 views
0

我有一个图像文件上传组件。确定上传图像的分辨率(DPI)

但是,我还希望能够检查DPI设置,因为这些图像最终将在纸上打印并提交。

在ASP.net,我通常可以做这样的事情:

using (var rawBitmap = new Bitmap(postedFile.InputStream)){ 
    var dpi = (decimal)rawBitmap.VerticalResolution/bitmap.Height;  
    // do other stuff. 
} 

然而,Silverlight的范围内,我没有访问相同的库为了做到这一点(也说,这是我第一次刺穿Silverlight,所以如果有办法让这些DLL进入,我完全赞成,但我无法导入我的实用包装器)。

我见过很多关于FJcore(imagetools也包装这个库)的建议,这是一个JPEG编码/解码实用程序。理论上,将JPEG流加载到解码器中并获取信息。

我已经尝试过使用FJcore的方法,但所有保存在photoshop中的文件都似乎缺少正确的标题,表明文件的明星,导致解码器失败。我也使用他们的单元测试证实了这个问题。

有关如何从silverlight文件上传图像分辨率的任何想法?

回答

3

图像的DPI并不总是存储在图像上。这通常是在扫描仪(或相机)捕获期间保存为元数据的额外属性。你实际上可以看到,如果你在C#中使用Bitmap加载JPEG并再次保存,DPI属性会丢失并设置为默认值96.

因此,这不是一个始终可靠的选项。我不认为有机会获得所有图像。实际上DPI对于不是由扫描仪创建的图片来说是不相关的。

+0

[EXIF](http://en.wikipedia.org/wiki/Exchangeable_image_file_format)经常被用来通过数码相机。不幸的是,它基本上只支持JPEG和TIFF图像:(有一些链接来自wiki页面,用于其他一些格式.YMMV并且很有趣。我不完全是DPI在相机中的意思,但:-) – 2010-10-19 22:43:52

+0

我曾经以为奇怪的是,位图甚至会有DPI属性,很好的解决了这个问题。在我们的例子中,保留DPI并不重要,但提取打印尺寸是。希望能有另一个库来解析元信息,但我想这只是它的方式。确切地说,是 – ddango 2010-10-19 22:46:28

+0

。 DPI依赖于设备上下文,但对于摄像机而言毫无意义。 – Aliostad 2010-10-19 22:48:20

0

尝试缩略词芯组件找到图像的DPI在Silverlight

FileStream stream = imageFiles.OpenRead(); 
DecodedJpeg jpegImage = new JpegDecoder(stream).Decode(); 
int imageDpi = jpegImage.Image.DensityX;