XP系统下,不加载图片,如何读取到图片的分辨率信息?

蜡笔小秋 2016-01-06 03:55:12
做了个图片压缩的功能,需要读取图片的“宽度、高度、水平分辨率、垂直分辨率、位深度”后,传给第三方组件进行压缩。

之前是这样写的:

using (Image img = Image.FromFile(filePath))
{
fiim.Height = img.Height;
fiim.Width = img.Width;
fiim.VerticalResolution = img.VerticalResolution;
fiim.HorizontalResolution = img.HorizontalResolution;
fiim.PixelFormat = img.PixelFormat;
}

但是遇到了700M左右的图片, Image.FromFile报内存不足挂掉了。。。

于是考虑不加载图片,通过文件属性去读取,用到了“Shell32.Folder”,Win7下没问题,但是XP下不行

ShellClass sh = new ShellClass();
Shell32.Folder folder = sh.NameSpace(filePath.Substring(0, filePath.LastIndexOf("\\")));
Shell32.FolderItem folderItem = folder.ParseName(filePath.Substring(filePath.LastIndexOf("\\") + 1));
this.lblBitDepth.Text = folder.GetDetailsOf(folderItem, 160);//位深度
this.lblHorizontal.Text = folder.GetDetailsOf(folderItem, 161);//水平分辨率
this.lblWidth.Text = folder.GetDetailsOf(folderItem, 162);//宽度
this.lblVertical.Text = folder.GetDetailsOf(folderItem, 162);//垂直分辨率
this.lblHeight.Text = folder.GetDetailsOf(folderItem, 164);//高度


以为是XP、Win7属性索引不同的问题,于是自己遍历了下Win7和XP下能读取到的所有属性


ShellClass sh = new ShellClass();
Shell32.Folder folder = sh.NameSpace(filePath.Substring(0, filePath.LastIndexOf("\\")));
Shell32.FolderItem folderItem = folder.ParseName(filePath.Substring(filePath.LastIndexOf("\\") + 1));
int i = 0;
while (true)
{
//获取属性名称
string key = folder.GetDetailsOf(null, i);
if (string.IsNullOrEmpty(key))
{
//当无属性可取时,退出循环
break;
}
//获取属性值
string value = folder.GetDetailsOf(folderItem, i);
//记录属性
this.txtlog.Text = string.Format("{0}\r\n{1}. {2} : {3}", this.txtlog.Text, i, key, value);
i++;
}

Win7下获取到的文件属性

0. 名称 : 110934530317347.tif
1. 大小 : 64.2 KB
2. 项目类型 : TIFF 图像
3. 修改日期 : 2014/9/11 9:35
4. 创建日期 : 2016/1/6 15:26
5. 访问日期 : 2016/1/6 15:26
6. 属性 : A
7. 脱机状态 :
8. 脱机可用性 :
9. 假设的类型 : 图像
10. 所有者 : HZFX-QC\Administrator
11. 种类 : 图片
12. 拍摄日期 :
13. 参与创作的艺术家 :
14. 唱片集 :
15. 年 :
16. 流派 :
17. 指挥者 :
18. 标记 :
19. 分级 : 未分级
20. 作者 :
21. 标题 :
22. 主题 :
23. 类别 :
24. 备注 :
25. 版权 :
26. # :
27. 长度 :
28. 比特率 :
29. 保护 :
30. 照相机型号 :
31. 尺寸 : ‪2498 x 1764‬
32. 照相机制造商 :
33. 公司 :
34. 文件说明 :
35. 程序名称 :
36. 持续时间 :
37. 联机 :
38. 重复 :
39. 位置 :
40. 可选参加者地址 :
41. 可选的与会者 :
42. 组织者地址 :
43. 组织者名称 :
44. 提醒时间 :
45. 必选的与会者地址 :
46. 必选的与会者 :
47. 资源 :
48. 会议状态 :
49. 忙闲状态 :
50. 总大小 :
51. 帐户名 :
52. 任务状态 :
53. 计算机 : HZFX-QC (本机)
54. 纪念日 :
55. 助理姓名 :
56. 助理电话 :
57. 生日 :
58. 商务地址 :
59. 公司所在市县 :
60. 公司所在国家/地区 :
61. 公司邮箱 :
62. 公司所在地的邮政编码 :
63. 公司所在省市自治区 :
64. 公司所在街道地址 :
65. 业务传真 :
66. 公司主页 :
67. 商务电话 :
68. 回呼号码 :
69. 车载电话 :
70. 子女 :
71. 公司主要电话 :
72. 部门 :
73. 电子邮件地址 :
74. 电子邮件2 :
75. 电子邮件3 :
76. 电子邮件列表 :
77. 电子邮件显示名称 :
78. 文件为 :
79. 名字 :
80. 全名 :
81. 性别 :
82. 名 :
83. 个人爱好 :
84. 住宅地址 :
85. 住宅所在市/县 :
86. 住宅所在国家/地区 :
87. 住宅邮箱 :
88. 住宅所在地的邮政编码 :
89. 住宅所在省市自治区 :
90. 住宅所在街道地址 :
91. 住宅传真 :
92. 住宅电话 :
93. 即时通讯地址 :
94. 姓名缩写 :
95. 职务 :
96. 标签 :
97. 姓氏 :
98. 通讯地址 :
99. 中间名 :
100. 手机 :
101. 昵称 :
102. 办公位置 :
103. 其他地址 :
104. 其他市县 :
105. 其他国家/地区 :
106. 其他邮政信箱 :
107. 其他邮政编码 :
108. 其他省市自治区 :
109. 其他街道地址 :
110. 寻呼机 :
111. 称谓 :
112. 市县 :
113. 国家/地区 :
114. 邮箱 :
115. 邮政编码 :
116. 省市自治区 :
117. 街道地址 :
118. 主要电子邮件 :
119. 主要电话 :
120. 职业 :
121. 配偶/伙伴 :
122. 后缀 :
123. TTY/TTD 电话 :
124. Telex :
125. 网页 :
126. 内容状态 :
127. 内容类型 :
128. 获取日期 :
129. 存档日期 :
130. 完成日期 :
131. 设备类别 :
132. 已连接 :
133. 发现方法 :
134. 友好名称 :
135. 本地计算机 :
136. 制造商 :
137. 型号 :
138. 已配对 :
139. 分类 :
140. 打印机状态 :
141. 客户端 ID :
142. 参与者 :
143. 创建内容的时间 :
144. 最后一次打印的时间 :
145. 最后一次保存的日期 :
146. 分部 :
147. 文档 ID :
148. 页码范围 :
149. 幻灯片 :
150. 总编辑时间 :
151. 字数 :
152. 截止日期 :
153. 结束日期 :
154. 文件计数 :
155. 文件名 : 110934530317347.tif
156. 文件版本 :
157. 标志颜色 :
158. 标记状态 :
159. 可用空间 :
160. 位深度 : 1
161. 水平分辩率 : ‎150 dpi
162. 宽度 : ‎2498 像素
163. 垂直分辩率 : ‎150 dpi
164. 高度 : ‎1764 像素
165. 重要性 :
166. 是附件 :
167. 已删除 :
168. 加密状态 :
169. 有标志 :
170. 已完成 :
171. 不完整 :
172. 阅读状态 :
173. 编写者 :
174. 日期 :
175. 文件夹名称 : 桌面
176. 文件夹路径 : C:\用户\Administrator\桌面
177. 文件夹 : 桌面 (C:\用户\Administrator)
178. 参加者 :
179. 路径 : C:\用户\Administrator\桌面\110934530317347.tif
180. 依位置 :
181. 类型 : TIFF 图像
182. 联系人 :
183. 条目类型 :
184. 语言 :
185. 访问时间 :
186. 描述 :
187. 链接状态 : 未解析
188. 链接目标 :
189. URL :
190. 创建媒体日期 :
191. 发布日期 :
192. 编码人员 :
193. 制作人 :
194. 发布者 :
195. 副标题 :
196. 用户 Web URL :
197. 创作人 :
198. 附件 :
199. 密件抄送地址 :
200. 密件抄送 :
201. 抄送地址 :
202. 抄送 :
203. 会话 ID :
204. 接收日期 :
205. 发送日期 :
206. 发件人地址 :
207. 发件人 :
208. 带有附件 :
209. 发信人地址 :
210. 发信人 :
211. 存储 :
212. 收件人地址 :
213. 操作标题 :
214. 收件人 :
215. 里程 :
216. 唱片集艺术家 :
217. 唱片集 ID :
218. 每分钟节拍数 :
219. 作曲者 :
220. 初始调性 :
221. 编译的一部分 :
222. 氛围 :
223. 部分设置 :
224. 时期 :
225. 颜色 :
226. 家长分级 :
227. 父级分级原因 :
228. 已用空间 :
229. EXIF 版本 :
230. 事件 :
231. 曝光补偿 :
232. 曝光程序 :
233. 曝光时间 :
234. 光圈值 :
235. 闪光灯模式 :
236. 焦距 :
237. 35mm 焦距 :
238. ISO 速度 :
239. 镜头制造商 :
240. 镜头型号 :
241. 光源 :
242. 最大光圈 :
243. 测光模式 :
244. 方向 :
245. 人员 :
246. 程序模式 :
247. 饱和度 :
248. 目标距离 :
249. 白平衡 :
250. 优先级 :
251. 项目 :
252. 频道号 :
253. 剧集名称 :
254. 关闭字幕 :
255. 重新运行 :
256. SAP :
257. 广播日期 :
258. 节目描述 :
259. 记录时间 :
260. 电台呼叫信号 :
261. 电台名 :
262. 摘要 :
263. 片段 :
264. 自动汇总 :
265. 搜索级别 :
266. 敏感度 :
267. 产品名称 :
268. 产品版本 :
269. 支持链接 :
270. 源 :
271. 开始日期 :
272. 帐单信息 :
273. 完成 :
274. 任务所有者 :
275. 总计文件大小 :
276. 合法商标 :
277. 视频压缩 :
278. 导演 :
279. 数据速率 :
280. 帧高度 :
281. 帧速率 :
282. 帧宽度 :
283. 总比特率 :
284. Masters Keywords (debug) :
285. Masters Keywords (debug) :

XP下获取到的文件属性

0. 名称 : 110934530317347.tif
1. 大小 : 65 KB
2. 类型 : TIF 图像
3. 修改日期 : 2014-9-11 9:35
4. 创建日期 : 2016-1-6 13:52
5. 访问日期 : 2016-1-6 13:52
6. 属性 : A
7. 状态 : 在线
8. 所有者 : TEST-0FEF8B2D4E\test
9. 作者 :
10. 标题 :
11. 主题 :
12. 类别 :
13. 页数 : 1
14. 备注 :
15. 版权 :
16. 艺术家 :
17. 唱片标题 :
18. 发行年 :
19. 曲目号码 :
20. 流派 :
21. 持续时间 :
22. 位速 :
23. 受保护 :
24. 摄影机型号 :
25. 相片拍照日期 :
26. 尺寸 : 2498 x 1764

有没有其他办法,能够解决这个问题?
...全文
204 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
_sunshine 2017-08-21
  • 打赏
  • 举报
回复
后面解决了吗?
xdashewan 2016-01-06
  • 打赏
  • 举报
回复
这只是获取别人在详细备注里填写的信息,就算不是XP也不是所有图片都带有这些信息。而且这些信息可以人为修改,并不可信。你要做的事,是去读图片的头部信息,然后解析这些信息获得分辨率。比如bmp的头部信息是这样的http://www.cnblogs.com/jerry-lin300/archive/2011/12/16/2233854.html,你通过解析这些数据得到分辨率的信息

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧