不使用Drawing.Image获取图像宽度/高度

时间:2010-02-15 16:56:55

标签: .net image drawing width gallery

我知道这听起来很奇怪。我有一个照片库,可以将图像信息(网址,名称,修改日期......)从硬盘保存到内存中。

我希望将图像宽度/高度存储到该集合中。我可以使用Drawing.Image类为每个文件获取它。但是考虑到图库可能会变得非常大,为每个文件创建一个新的图像对象会显着降低性能。

任何想法?,谢谢

3 个答案:

答案 0 :(得分:2)

自从我对图像文件进行原始处理以来,这是一段很长的时间,但我认为使用最常见的格式(GIF,BMP,JPG等),您可能会发现其中的高度/宽度。文件的前几百个字节(或更少)。你必须做一些编码来处理标题信息(可能在线大量的例子),但它应该显着加快你的过程,而不是将整个图像读入内存。

答案 1 :(得分:1)

从Windows资源管理器中提取信息。

看看这里:

或在这里:

或者您也可以使用以下内容读取扩展文件属性:

public static void Main(string[] args)
{
    List<string> arrHeaders = new List<string>();    
    Shell32.Shell shell = new Shell32.Shell();
    Shell32.Folder objFolder = shell.NameSpace(@"C:\temp\testprop");

    for( int i = 0; i < short.MaxValue; i++) {
        string header = objFolder.GetDetailsOf(null, i);
        if (String.IsNullOrEmpty(header)) break;
        arrHeaders.Add(header);
    }

    foreach(Shell32.FolderItem2 item in objFolder.Items()) {
        for (int i = 0; i < arrHeaders.Count; i++) {
            Console.WriteLine("{0}\t{1}: {2}", i, 
                arrHeaders[i], objFolder.GetDetailsOf(item, i));
        }
    }
}

答案 2 :(得分:0)

如果您想在不为每个图像实际构建Image对象实例的情况下获取该信息,则需要编写读取每个单独图像文件并提取信息的代码。虽然肯定有可能,但你会发现它有点牵扯。首先,您需要读取文件前几个字节的代码来确定文件中包含的图像类型(.bmp,.gif,.png,.jpg等),然后您需要特殊代码,用于提取您支持的每种图像类型的信息。

而上述几乎肯定会比加载整个图像的代码更快,提取相关数据,然后破坏图像,我不能说多快。很可能节省的执行时间并不足以证明您在此类解决方案中投入的时间。

如果我正在编写这个程序,我的第一个剪辑就像ChrisF建议的那样,写下类似的东西:

foreach (string filename in ImageFilenames)
{
    using (Bitmap bmp = new Bitmap(filename))
    {
        // extract and store needed information
    }
}

一旦你开始工作,你可以决定它是否足够快你的目的。如果不是,那么我建议你在一个测试中修改那个循环来模拟通过读取每个文件的第一个千字节来提取信息:

foreach (string filename in ImageFilenames)
{
    using (File f = File.OpenRead(filename))
    {
        // read the first 1K from the file
        // store some placeholder data for height/width
    }
}

如果它的速度明显快于第一个,那么可能值得研究进行自己的图像头解析的可能性。但请注意,您正在打开一大堆蠕虫。图像头解析可以非常复杂。