1

我目前正在使用 C# 开发 Windows 窗体应用程序。我想知道如何检索图像的创建日期和时间。我在网上查了解决方案,找到了对 PropertyItem 的引用,但我不明白如何使用它。

我下面的代码从文件夹中获取照片并将它们显示在图片数组中。
单击时如何在 MessageBox 中显示图片的创建日期和时间?

    // Function to add PictureBox Controls
    private void AddControls(int cNumber)
    {
        imgArray = new System.Windows.Forms.PictureBox[cNumber]; // assign number array 
        for (int i = 0; i < cNumber; i++)
        {
            imgArray[i] = new System.Windows.Forms.PictureBox(); // Initialize one variable
        }
        // When call this function you determine number of controls
    }

    private void ClickImage(Object sender, System.EventArgs e)
    {
        // On Click: load (ImageToShow) with (Tag) of the image
        ImageToShow = ((System.Windows.Forms.PictureBox)sender).Tag.ToString();
        // then view this image on the form (frmView)

        PrivacyDefenderTabControl.SelectedIndex = 5;
        LogsPhotosPictureBox.Image = Image.FromFile(ImageToShow);
        LogsPhotosPictureBox.Left = (this.Width - LogsPhotosPictureBox.Width) / 15;
    }

    private void ImagesInFolder()
    {
        FileInfo FInfo;
        // Fill the array (imgName) with all images in any folder 
        imgName = Directory.GetFiles(Application.StartupPath + @"\Faces");
        // How many Picture files in this folder
        NumOfFiles = imgName.Length;
        imgExtension = new string[NumOfFiles];
        for (int i = 0; i < NumOfFiles; i++)
        {
            FInfo = new FileInfo(imgName[i]);
            imgExtension[i] = FInfo.Extension; // We need to know the Extension
        }
    }

    private void ShowFolderImages()
    {
        int Xpos = 27;
        int Ypos = 8;
        Image img;
        Image.GetThumbnailImageAbort myCallback =
            new Image.GetThumbnailImageAbort(ThumbnailCallback);
        MyProgress.Visible = true;
        MyProgress.Minimum = 0;
        MyProgress.Maximum = NumOfFiles;
        MyProgress.Value = 0;
        MyProgress.Step = 1;
        string[] Ext = new string[] { ".GIF", ".JPG", ".BMP", ".PNG" };
        AddControls(NumOfFiles);
        for (int i = 0; i < NumOfFiles; i++)
        {
            switch (imgExtension[i].ToUpper())
            {
                case ".JPG":
                case ".BMP":
                case ".GIF":
                case ".PNG":
                    img = Image.FromFile(imgName[i]); // or img = new Bitmap(imgName[i]);
                    imgArray[i].Image = img.GetThumbnailImage(64, 64, myCallback, IntPtr.Zero);
                    img = null;
                    if (Xpos > 360) // six images in a line
                    {
                        Xpos = 27; // leave eight pixels at Left 
                        Ypos = Ypos + 72;  // height of image + 8
                    }
                    imgArray[i].Left = Xpos;
                    imgArray[i].Top = Ypos;
                    imgArray[i].Width = 64;
                    imgArray[i].Height = 64;
                    imgArray[i].Visible = true;
                    // Fill the (Tag) with name and full path of image
                    imgArray[i].Tag = imgName[i];
                    imgArray[i].Click += new System.EventHandler(ClickImage);
                    this.LogsTabPage.Controls.Add(imgArray[i]);
                    Xpos = Xpos + 72; // width of image + 8
                    Application.DoEvents();
                    MyProgress.PerformStep();
                    break;
            }
        }
        MyProgress.Visible = false;
    }
4

2 回答 2

2

一个Image,一旦加载,与它的原始文件没有任何关系。如果,当用户单击时,您能够检索图片的原始文件名,您可以使用:

var lastEditDate = File.GetLastWriteTime("file.jpg");

或者,如果您已经使用FileInfo实例,则可以使用:

var lastEditDate = new FileInfo("file.jpg").LastWriteTime;

Since you can't derive from Image, as its constructor is internal, you can keep a Dictionary<Image,string> somewhere, populate it when the images are loaded, then retrieve the path relative of the clicked image through a lookup.

于 2013-01-02T05:39:24.653 回答
0

At least jpeg files have meta data attached. Please not: it might be attached, but you can't ensure it's there.

You are already reading the image (Image.FromFile) and the resulting object supports the method GetPropertyItem. With that property you can read out meta data. There are a list of available properties (0x0132 should be date and time) and a sample.

于 2013-01-02T05:40:36.323 回答