• C# 获取图片的大小和分辨率


    C# 获取图片的大小和分辨率 [转贴 2011-4-20 13:39:19]   
    我顶 字号:  

    文章来源: CSDN博客

    //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;
            }

    我最近在玩和讯微博,很方便,很实用,你也来和我一起玩吧!
    去看看我的微博吧!http://t.hexun.com/4194019/default.html

  • 相关阅读:
    分享
    慕课网-软件测试基础-学习笔记
    向量内积(点乘)和外积(叉乘)概念及几何意义
    使用opencv3+python实现视频运动目标检测
    解决opencv3运行opencv2代码时报错的修改备忘录
    分享
    OpenCV学习笔记
    LeetCode
    LeetCode
    npm安装包很慢
  • 原文地址:https://www.cnblogs.com/xianyin05/p/3076382.html
Copyright © 2020-2023  润新知