2008-09-12 12 views
61

저는 C#으로 jpeg 사진을 통해 작은 프로그램을 작성하고 싶습니다. 예를 들어, 날짜순으로 날짜순으로 정렬합니다 (damating ...).).C#을 사용하여 파일에서 EXIF ​​데이터를 얻는 방법

누군가가 프로그램과 같이 날짜와 시간 또는 노출과 같은 EXIF ​​데이터를 비교적 쉽게 얻을 수 있다는 것을 알고 있습니까? 감사합니다.

+0

BCL에 내장 된 이미지 메타 데이터 지원은 매우 제한적입니다. 저는 2002 년부터 Exif와 같은 메타 데이터로 작업 해 왔으며 단순하지만 강력한 [.NET 용 데이터 추출 라이브러리] (https://github.com/drewnoakes/metadata-extractor-dotnet)를 보유하고 있습니다. –

답변

3

JPEG 이미지에서 EXIF ​​데이터를 얻기가 포함됩니다

  1. 는 EXIF ​​데이터의 시작을 가지 설명 JPEG 마커를 찾는 ,. 예 : 일반적으로 oxFFE1은 EXIF ​​데이터를 인코딩하는 동안 삽입되는 마커입니다.이 마커는 EXIF ​​데이터가있는 APPlication 세그먼트입니다.
  2. 0xFFE1에서 0xFFE2까지의 모든 데이터를 구문 분석하십시오. 이 데이터는 JPEG로 인코딩 된 파일의 바이트 스트림입니다. 이 바이트의
  3. ASCII 상당
5

이미지 클래스는 PropertyItems 및 PropertyIdList 특성을 가지고 있습니다 ... 이미지 날짜, 카메라 모델명, 노출 등 관련된 다양한 정보를 포함한다. 당신은 그들을 사용할 수 있습니다.

+0

그것은 읽기 전용이므로 새 이미지에 아무 것도 추가 할 수 없습니다. – TigrouMeow

+3

새 이미지에 Image.SetPropertyItem (PropertyItem) 함수를 사용하십시오. –

9

체크 아웃이 metadata extractor입니다. Java로 작성되었지만 C#으로 포팅되었습니다. 자바 버전을 사용하여 날짜 및 모델 태그를 기반으로 내 jpeg 파일의 이름을 바꾸는 작은 유틸리티를 작성했습니다. 매우 사용하기 쉽습니다.


편집메타 데이터 추출 너무 .NET을 지원합니다. 이미지 및 비디오에서 메타 데이터에 액세스하기위한 매우 빠르고 간단한 라이브러리입니다.

그것은 완전히 그건

var directories = ImageMetadataReader.ReadMetadata(imagePath); 

// print out all metadata 
foreach (var directory in directories) 
foreach (var tag in directory.Tags) 
    Console.WriteLine($"{directory.Name} - {tag.Name} = {tag.Description}"); 

// access the date time 
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault(); 
var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTime); 

EXIF뿐만 아니라, IPTC, XMP 및 JPEG, PNG, GIF, PNG, ICO, WebP 형식, PSD, 포함 파일 형식의 메타 데이터의 많은 다른 유형을 ... 지원 NuGetcode's on GitHub을 통해 제공됩니다.

9

다음은 similar SO question에 대한 링크입니다. 여기에는 닷넷의 "Reading, writing and photo metadata"에 대한이 좋은 기사를 가리키는 답변이 있습니다.

+0

[ExifLib - A Fast Exif Data Extractor for .NET 2.0]을 가리키는 ** 매우 좋은 답변 ** [여기에 있습니다] (https://stackoverflow.com/q/10494796/2803565) (https : //www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0) –

40

제안 된 것처럼 일부 타사 라이브러리를 사용하거나 수동으로 수행 할 수 있지만 가장 간단하고 유연한 방법은 아마도 .NET에서 기본 제공되는 기능을 사용하는 것입니다. 더 참조 :

  • How to: Read Image Metadata

  • 내가 .NET 해석을 시도하거나하지 않기 때문에 "가 가장 유연"라고 어떤 식 으로든 데이터를 통합합니다. 각 EXIF에 대해 기본적으로 바이트 배열을 가져옵니다. 이는 실제로 얼마나 많은 통제력이 필요한지에 따라 좋거나 나쁠 수 있습니다.

    또한 속성 목록이 사실 EXIF ​​값과 직접적으로 일치하지 않는다는 것을 지적해야합니다. EXIF 자체는 ID가 중복되는 여러 테이블에 저장되지만 .NET은 모든 것을 하나의 목록에 넣고 일부 항목의 ID를 다시 정의합니다. 그러나 정확한 EXIF ​​ID를 신경 쓰지 않는다면 .NET 매핑을 사용하면됩니다.

    +8

    Bitmap.PropertyItems에 액세스하려면 전체 파일을 메모리로 읽어야합니다. Bitmap을 만들고 PropertyItems에 액세스하고 다른 작업을 수행하지 않으면 XPerf를 사용하여 앱이 이미지 파일에 액세스하여이를 메모리에 모두 읽음을 확인할 수 있습니다. 내 컴퓨터의 경우, 3.4Mb 파일은 PropertyItems를 통해 EXIF를 얻으려면> 700ms의 IO 비용이 필요합니다. (. – Tristan

    +4

    비교해 보면 Picasa의 PhotoViewer는 터치하는 각 파일에서 20-30k를 읽습니다. 나는 그 물건을 쓴 남자/여자와 채팅하고 싶다. (데이터는 XPerf를 사용하여 PhotoViewer의 시작을 프로파일 링하여 수집했다.) – Tristan

    +0

    @Tristan : 유용한 정보,하지만 이미지 자체도 원하지 않고 얼마나 자주 이미지 메타 데이터에 액세스 하는가? ? 몇 가지 사례가있을 것이라고 확신하지만 대다수의 경우 이미지를 표시하거나 데이터로 작업하고 동시에 메타 데이터라고 생각합니다 – jrista

    6

    F-Spot과 같은 응용 프로그램에서 사용하는 TagLib#을 사용할 수 있습니다. Exif 외에도 이미지, 오디오 및 비디오 용으로 많은 양의 메타 데이터 형식을 읽습니다.

    나는 또한 ExifUtils API를 좋아하지만 버그가있어 활발하게 개발되지 않았습니다.

    3

    명령 줄 도구 ExifTool by Phil Harvey은 많은 독점 RAW 형식을 비롯하여 수십 개의 이미지 형식으로 작동하며 EXIF, GPS, IPTC, XMP, JFIF 등 다양한 메타 데이터 형식을 조작 할 수 있습니다.

    매우 사용하기 쉽고 가볍고 인상적인 응용 프로그램입니다.

    +0

    ExifTool은 놀라운 lib/tool이지만 Perl로 작성 되었기 때문에 C#에서 사용하려면 외부 프로세스를 시작해야합니다. –

    관련 문제