Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 改变;“已拍摄日期”;一张照片_C#_Bitmap_Exif - Fatal编程技术网

C# 改变;“已拍摄日期”;一张照片

C# 改变;“已拍摄日期”;一张照片,c#,bitmap,exif,C#,Bitmap,Exif,我刚从美国旅行回来,编辑完所有照片后,我注意到相机使用的是以色列时区,而不是美国时区。有7个小时的时差,所以这对我来说是个大问题。我有175GB的照片,但我只关心大约350张照片。我无法手动编辑它们的EXIF,因此我考虑使用C# 这个想法是,它将读取每张照片的EXIF,获取时间,并在原始照片中设置时间减去7小时。我试着使用Image类,但它不起作用。我试着使用bitmapMetadate,它成功了!我已经设法争取到了时间,只剩下零下七个小时,但我不知道如何节省时间。我怎么做?谢谢 pub

我刚从美国旅行回来,编辑完所有照片后,我注意到相机使用的是以色列时区,而不是美国时区。有7个小时的时差,所以这对我来说是个大问题。我有175GB的照片,但我只关心大约350张照片。我无法手动编辑它们的EXIF,因此我考虑使用C#

这个想法是,它将读取每张照片的EXIF,获取时间,并在原始照片中设置时间减去7小时。我试着使用Image类,但它不起作用。我试着使用bitmapMetadate,它成功了!我已经设法争取到了时间,只剩下零下七个小时,但我不知道如何节省时间。我怎么做?谢谢

    public static string PhotoToBeEdited(FileInfo f)
    {
        FileStream fs = new FileStream(f.FullName, FileMode.Open, FileAccess.Read, FileShare.Read);
        BitmapSource img = BitmapFrame.Create(fs);
        BitmapMetadata md = (BitmapMetadata)img.Metadata;
        string date = md.DateTaken;
        Console.WriteLine(date);
        DateTime dt= DateTime.Parse(date);
        date = dt.AddHours(-7).ToString();

        [...]

        return date;
    }

不完全是一个编程解决方案,但您可以使用。我使用它就是为了这个目的

日期/时间转换功能

您是否忘记设置数码相机的日期/时间 在拍一堆照片之前?ExifTool具有时移功能 这使得将批处理修复应用于 图像(例如,更改Windows报告的“拍摄日期” 浏览器)。例如,假设您的相机时钟已重置为 2000:01:01 00:00:00当您在2005:11:03安装新电池时 10:48:00. 那么你后来拍的所有照片都有 错误的时间戳为5年、10个月、2天、10小时和 48分钟。要解决此问题,请将所有图像放在同一目录中 (“DIR”)并运行exiftool:

> exiftool "-DateTimeOriginal+=5:10:2 10:48:0" DIR

您还可以设置该字段,以防有软件实际使用它。

我发现最简单的方法是使用技术说明和System.Drawing.Bitmap

代码应如下所示:

  public void ChangeDateTaken(string path)
    {
        Image theImage = new Bitmap(path);
        PropertyItem[] propItems = theImage.PropertyItems;
        Encoding _Encoding = Encoding.UTF8;
        var DataTakenProperty1 = propItems.Where(a => a.Id.ToString("x") == "9004").FirstOrDefault();
        var DataTakenProperty2 = propItems.Where(a => a.Id.ToString("x") == "9003").FirstOrDefault();
        string originalDateString = _Encoding.GetString(DataTakenProperty1.Value);
        originalDateString = originalDateString.Remove(originalDateString.Length - 1);
        DateTime originalDate = DateTime.ParseExact(originalDateString, "yyyy:MM:dd HH:mm:ss", null);

        originalDate = originalDate.AddHours(-7);


        DataTakenProperty1.Value = _Encoding.GetBytes(originalDate.ToString("yyyy:MM:dd HH:mm:ss") + '\0');
        DataTakenProperty2.Value = _Encoding.GetBytes(originalDate.ToString("yyyy:MM:dd HH:mm:ss") + '\0');
        theImage.SetPropertyItem(DataTakenProperty1);
        theImage.SetPropertyItem(DataTakenProperty2);
        string new_path = System.IO.Path.GetDirectoryName(path) + "\\_" + System.IO.Path.GetFileName(path);
        theImage.Save(new_path);
        theImage.Dispose();
    }
别忘了添加系统。绘图组件。
此外,您可能需要根据您的区域性调整DateTime格式,如果需要的话

对于.NET Core,我使用NuGet软件包ExifLibNet()

PM>安装软件包ExifLibNet

// using ExifLibrary;

var file = ImageFile.FromFile(filename);
file.Properties.Set(ExifTag.DateTimeDigitized, dateTime);
file.Properties.Set(ExifTag.DateTimeOriginal, dateTime);
file.Save(filename);

谢谢你真是个天才!提示:如果尚未指定日期,则必须创建新的丙酸盐。这并不容易,因为构造函数不允许这样做,但我找到了一种方法。所以你可以检查DataTakenProperty1是否为null,如果为null,就创建新的propitem。我试过了,放弃了。我不知道如何使用它。无论如何,谢谢你。顺便说一句,你有一个伟大的名字!LinqPad脚本,如果您不太喜欢键入: