如果你想获得图像尺寸(宽度和高度)而不加载图像,你需要自己阅读一些JPEG文件的一部分,如下所示。
这里是一个开箱即用的方法为你:)
public static Size GetJpegImageSize(string filename) {
FileStream stream=null;
BinaryReader rdr=null;
try {
stream=File.OpenRead(filename);
rdr=new BinaryReader(stream);
// keep reading packets until we find one that contains Size info
for(; ;) {
byte code=rdr.ReadByte();
if(code!=0xFF) throw new ApplicationException(
"Unexpected value in file "+filename);
code=rdr.ReadByte();
switch(code) {
// filler byte
case 0xFF:
stream.Position--;
break;
// packets without data
case 0xD0: case 0xD1: case 0xD2: case 0xD3: case 0xD4:
case 0xD5: case 0xD6: case 0xD7: case 0xD8: case 0xD9:
break;
// packets with size information
case 0xC0: case 0xC1: case 0xC2: case 0xC3:
case 0xC4: case 0xC5: case 0xC6: case 0xC7:
case 0xC8: case 0xC9: case 0xCA: case 0xCB:
case 0xCC: case 0xCD: case 0xCE: case 0xCF:
ReadBEUshort(rdr);
rdr.ReadByte();
ushort h=ReadBEUshort(rdr);
ushort w=ReadBEUshort(rdr);
return new Size(w, h);
// irrelevant variable-length packets
default:
int len=ReadBEUshort(rdr);
stream.Position+=len-2;
break;
}
}
} finally {
if(rdr!=null) rdr.Close();
if(stream!=null) stream.Close();
}
}
private static ushort ReadBEUshort(BinaryReader rdr) {
ushort hi=rdr.ReadByte();
hi<<=8;
ushort lo=rdr.ReadByte();
return (ushort)(hi|lo);
}
这不是我的代码,得到这个例子一段时间回来代码项目。我复制并保存到我的实用程序片段,但不记得链接。
不要Windows探索去权限操作系统,因为问问图像在磁盘上分配了多少空间?它不是文件属性吗?或者正如你所说,它是编码元数据? – Paxic 2009-02-16 07:31:41
@panix - 对不起,如果我困惑你。我的意思是宽度+高度的大小,而不是字节的大小。 – 2009-02-16 07:34:47
@shy你知道这是探险家吗?我可以依靠Windows资源管理器的元数据吗?我只是觉得这有些鬼鬼祟祟,在一些奇怪的边缘情况下可能不可靠 - 这就是为什么我发布了问题 – 2009-02-16 07:35:40