0

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

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

有什么想法吗,谢谢

4

3 回答 3

2

自从我对图像文件进行原始处理以来已经有很长时间了,但我认为对于最常见的格式(GIF、BMP、JPG 等),您可能可以在前几百个中找到高度/宽度文件的字节(或更少)。您必须进行一些编码来处理标头信息(可能有大量在线示例),但与将整个图像读入内存相比,它应该会显着加快您的处理速度。

于 2010-02-15T17:18:32.753 回答
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));
        }
    }
}
于 2010-02-15T17:29:28.190 回答
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
    }
}

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

于 2010-02-15T17:24:42.273 回答