C#快速获取JPG图片大小及英寸分辨率
2012-09-03 17:03
295 查看
//C#快速获取JPG图片大小及英寸分辨率
public static int getJpgSize(string
FileName, out Size JpgSize, out float Wpx, out float Hpx)
{//C#快速获取JPG图片大小及英寸分辨率
JpgSize = new Size(0, 0);
Wpx = 0; Hpx = 0;
int rx = 0;
if
(!File.Exists(FileName)) return rx;
FileStream F_Stream =
File.OpenRead(FileName);
int ff =
F_Stream.ReadByte();
int type =
F_Stream.ReadByte();
if (ff != 0xff || type !=
0xd8)
{//非JPG文件
F_Stream.Close();
return rx;
}
long ps = 0;
do
{
do
{
ff =
F_Stream.ReadByte();
if (ff < 0)
//文件结束
{
F_Stream.Close();
return rx;
}
} while (ff != 0xff);
do
{
type =
F_Stream.ReadByte();
} while (type == 0xff);
//MessageBox.Show(ff.ToString() + "," + type.ToString(),
F_Stream.Position.ToString());
ps =
F_Stream.Position;
switch (type)
{
case 0x00:
case
0x01:
case 0xD0:
case
0xD1:
case 0xD2:
case
0xD3:
case 0xD4:
case
0xD5:
case 0xD6:
case
0xD7:
break;
case 0xc0:
//SOF0段
ps = F_Stream.ReadByte() *
256;
ps = F_Stream.Position + ps +
F_Stream.ReadByte() - 2; //加段长度
F_Stream.ReadByte();
//丢弃精度数据
//高度
JpgSize.Height = F_Stream.ReadByte() * 256;
JpgSize.Height = JpgSize.Height +
F_Stream.ReadByte();
//宽度
JpgSize.Width = F_Stream.ReadByte() * 256;
JpgSize.Width = JpgSize.Width + F_Stream.ReadByte();
//后面信息忽略
if (rx!=1 && rx < 3) rx = rx +
1;
break;
case 0xe0:
//APP0段
ps = F_Stream.ReadByte() *
256;
ps = F_Stream.Position + ps +
F_Stream.ReadByte() - 2; //加段长度
F_Stream.Seek(5,SeekOrigin.Current);
//丢弃APP0标记(5bytes)
F_Stream.Seek(2,SeekOrigin.Current);
//丢弃主版本号(1bytes)及次版本号(1bytes)
int
units=F_Stream.ReadByte();
//X和Y的密度单位,units=0:无单位,units=1:点数/英寸,units=2:点数/厘米
//水平方向(像素/英寸)分辨率
Wpx=F_Stream.ReadByte()*256;
Wpx=Wpx+F_Stream.ReadByte();
if (units == 2) Wpx =
(float)(Wpx * 2.54); //厘米变为英寸
//垂直方向(像素/英寸)分辨率
Hpx = F_Stream.ReadByte() *
256;
Hpx = Hpx +
F_Stream.ReadByte();
if (units == 2) Hpx =
(float)(Hpx * 2.54); //厘米变为英寸
//后面信息忽略
if (rx!=2 && rx<3) rx = rx +
2;
break;
default:
//别的段都跳过////////////////
ps = F_Stream.ReadByte() *
256;
ps = F_Stream.Position + ps +
F_Stream.ReadByte() - 2; //加段长度
break;
}
if (ps + 1 >= F_Stream.Length)
//文件结束
{
F_Stream.Close();
return rx;
}
F_Stream.Position = ps; //移动指针
} while (type
!= 0xda); // 扫描行开始
F_Stream.Close();
return
rx;
}
public static int getJpgSize(string
FileName, out Size JpgSize, out float Wpx, out float Hpx)
{//C#快速获取JPG图片大小及英寸分辨率
JpgSize = new Size(0, 0);
Wpx = 0; Hpx = 0;
int rx = 0;
if
(!File.Exists(FileName)) return rx;
FileStream F_Stream =
File.OpenRead(FileName);
int ff =
F_Stream.ReadByte();
int type =
F_Stream.ReadByte();
if (ff != 0xff || type !=
0xd8)
{//非JPG文件
F_Stream.Close();
return rx;
}
long ps = 0;
do
{
do
{
ff =
F_Stream.ReadByte();
if (ff < 0)
//文件结束
{
F_Stream.Close();
return rx;
}
} while (ff != 0xff);
do
{
type =
F_Stream.ReadByte();
} while (type == 0xff);
//MessageBox.Show(ff.ToString() + "," + type.ToString(),
F_Stream.Position.ToString());
ps =
F_Stream.Position;
switch (type)
{
case 0x00:
case
0x01:
case 0xD0:
case
0xD1:
case 0xD2:
case
0xD3:
case 0xD4:
case
0xD5:
case 0xD6:
case
0xD7:
break;
case 0xc0:
//SOF0段
ps = F_Stream.ReadByte() *
256;
ps = F_Stream.Position + ps +
F_Stream.ReadByte() - 2; //加段长度
F_Stream.ReadByte();
//丢弃精度数据
//高度
JpgSize.Height = F_Stream.ReadByte() * 256;
JpgSize.Height = JpgSize.Height +
F_Stream.ReadByte();
//宽度
JpgSize.Width = F_Stream.ReadByte() * 256;
JpgSize.Width = JpgSize.Width + F_Stream.ReadByte();
//后面信息忽略
if (rx!=1 && rx < 3) rx = rx +
1;
break;
case 0xe0:
//APP0段
ps = F_Stream.ReadByte() *
256;
ps = F_Stream.Position + ps +
F_Stream.ReadByte() - 2; //加段长度
F_Stream.Seek(5,SeekOrigin.Current);
//丢弃APP0标记(5bytes)
F_Stream.Seek(2,SeekOrigin.Current);
//丢弃主版本号(1bytes)及次版本号(1bytes)
int
units=F_Stream.ReadByte();
//X和Y的密度单位,units=0:无单位,units=1:点数/英寸,units=2:点数/厘米
//水平方向(像素/英寸)分辨率
Wpx=F_Stream.ReadByte()*256;
Wpx=Wpx+F_Stream.ReadByte();
if (units == 2) Wpx =
(float)(Wpx * 2.54); //厘米变为英寸
//垂直方向(像素/英寸)分辨率
Hpx = F_Stream.ReadByte() *
256;
Hpx = Hpx +
F_Stream.ReadByte();
if (units == 2) Hpx =
(float)(Hpx * 2.54); //厘米变为英寸
//后面信息忽略
if (rx!=2 && rx<3) rx = rx +
2;
break;
default:
//别的段都跳过////////////////
ps = F_Stream.ReadByte() *
256;
ps = F_Stream.Position + ps +
F_Stream.ReadByte() - 2; //加段长度
break;
}
if (ps + 1 >= F_Stream.Length)
//文件结束
{
F_Stream.Close();
return rx;
}
F_Stream.Position = ps; //移动指针
} while (type
!= 0xda); // 扫描行开始
F_Stream.Close();
return
rx;
}
相关文章推荐
- python 快速获取图片大小
- javascript 快速获取图片实际大小的宽高
- javascript 通过定时循环检测获取快速获取图片实际大小的宽高
- Js快速获取图片的大小
- C# 图片与字节数组(byte[])二进制相互转换,获取大小像素扩展名
- javascript 快速获取图片实际大小的宽高
- C# 获取图片的大小和分辨率
- java快速获取大图片的分辨率(大图片格式JPG,tiff ,eg)
- 用javaScript获取文件,jpg图片大小
- [转]c# winform 用鼠标滚轮控制图片大小,获取鼠标中键滚轮事件,MouseWheel事件
- 用javaScript获取文件,jpg图片大小
- PS图片压缩教程,教你快速压缩jpg图片文件的大小而又不失真!
- iOS 获取网络图片的大小
- PHP高效获取远程图片尺寸和大小
- jQuery获取file控件中图片的宽高与大小
- 转载:JS快速获取图片宽高的方法
- 通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
- C# 设置Word文档中图片的大小
- 将matlab中用plot绘制的图片保存为任意大小的jpg图片
- C#获取“所有用户”的路径, 我的桌面,我的文档,我的音乐,我的图片等等目录