1

我想获取图像的高度和宽度。目前我正在做的是

Bitmap b=new Bitmap(path);
w=b.width;h=b.height;

有没有更好的方法来做到这一点,而无需创建和处置 Bitmap 对象,从而不浪费内存。

4

2 回答 2

1

从下面的参考资料看来,.NET 2.0 类库中没有它的功能。下面的代码块应该可以工作,

目前没有错误检查或任何其他验证,它通常不会从图像中读取超过 6K,具体取决于 EXIF 数据量。

示例代码

using System;
using System.IO;

namespace Test
{

    class Program
    {

        static bool GetJpegDimension(
            string fileName,
            out int width,
            out int height)
        {

            width = height = 0;
            bool found = false;
            bool eof = false;

            FileStream stream = new FileStream(
                fileName,
                FileMode.Open,
                FileAccess.Read);

            BinaryReader reader = new BinaryReader(stream);

            while (!found || eof)
            {

                // read 0xFF and the type
                reader.ReadByte();
                byte type = reader.ReadByte();

                // get length
                int len = 0;
                switch (type)
                {
                    // start and end of the image
                    case 0xD8: 
                    case 0xD9: 
                        len = 0;
                        break;

                    // restart interval
                    case 0xDD: 
                        len = 2;
                        break;

                    // the next two bytes is the length
                    default: 
                        int lenHi = reader.ReadByte();
                        int lenLo = reader.ReadByte();
                        len = (lenHi << 8 | lenLo) - 2;
                        break;
                }

                // EOF?
                if (type == 0xD9)
                    eof = true;

                // process the data
                if (len > 0)
                {

                    // read the data
                    byte[] data = reader.ReadBytes(len);

                    // this is what we are looking for
                    if (type == 0xC0)
                    {
                        width = data[1] << 8 | data[2];
                        height = data[3] << 8 | data[4];
                        found = true;
                    }

                }

            }

            reader.Close();
            stream.Close();

            return found;

        }

        static void Main(string[] args)
        {
            foreach (string file in Directory.GetFiles(args[0]))
            {
                int w, h;
                GetJpegDimension(file, out w, out h);
                System.Console.WriteLine(file + ": " + w + " x " + h);
            }
        }

    }
}

参考:在不读取整个文件的情况下获取图像尺寸

更新

读取图像标题以获取宽度和高度适用于 JPG、GIF、PNG 和 BMP 图像类型。

于 2012-06-23T10:07:25.307 回答
1

这可能会有所帮助,使用 System.Drawing 命名空间

 System.Drawing.Image objImage = System.Drawing.Image.FromFile(Filepath);
            imageWidth = objImage.Width;
            imageHeight = objImage.Height; 
于 2014-09-13T11:19:38.760 回答