2017-09-30 11 views
0

MVC 응용 프로그램을 사용하여 이미지를 업로드 할 때 DB에 저장하기 전에 파일 크기를 줄여야하지만 EXIF ​​데이터는 그대로 유지해야합니다. 이 원본 업로드 된 이미지에서이 문제를 가져온 다음 MetaDataExtractor를 사용하여 크기 조정 된 이미지에 EXIF ​​다시 추가

MetadataExtractor

를 사용하여 크기가 조정 하나에 추가하는 것입니다 우리는 그런 다음이

fext = IO.Path.GetExtension(file.FileName).ToLower 
Dim vLen As Integer = file.ContentLength 
Dim vData(vLen - 1) As Byte 
Dim image_file As System.Drawing.Image = System.Drawing.Image.FromStream(file.InputStream) 
Dim image_height As Integer = image_file.Height 
Dim image_width As Integer = image_file.Width 
Dim max_height As Integer = 240 
Dim max_width As Integer = 320 

image_height = (image_height * max_width)/image_width 
image_width = max_width 

If image_height > max_height Then 
    image_width = (image_width * max_height)/image_height 
    image_height = max_height 
End If 

Dim bitmap_file As New System.Drawing.Bitmap(image_file, image_width, image_height) 

Using vStream As New IO.MemoryStream 
    Select Case fext 
     Case ".jpg" 
      bitmap_file.Save(vStream, System.Drawing.Imaging.ImageFormat.Jpeg) 
     Case ".jpeg" 
      bitmap_file.Save(vStream, System.Drawing.Imaging.ImageFormat.Jpeg) 
     Case ".png" 
      bitmap_file.Save(vStream, System.Drawing.Imaging.ImageFormat.Png) 
     Case ".gif" 
      bitmap_file.Save(vStream, System.Drawing.Imaging.ImageFormat.Gif) 
     Case Else 
      bitmap_file.Save(vStream, System.Drawing.Imaging.ImageFormat.Jpeg) 
    End Select 
    vStream.Position = 0 
    vStream.Read(vData, 0, vStream.Length) 
    vImageFile = vData 

    vData = Nothing 
End Using 
같은 이미지의 크기를 조절이

Dim vMetadata As IEnumerable(Of System.IO.Directory) = MetadataExtractor.ImageMetadataReader.ReadMetadata(file.InputStream) 

같은 메타 데이터를 얻을 수 있습니다

그래서 우리는 메타 데이터를 사전으로 저장하고 축소 된 크기의 이미지 파일을 변수 vImageFile로 저장할 수 있습니다 ...

질문은 - 새 파일에 메타 데이터를 다시 추가하려면 어떻게합니까?

는 ---------------- 당신이

가 ------------------- 편집 2017 년 10 월 01 추가 감사 ----

나는 방향 수에 대한 핸들을 얻기 위해이 코드

Dim vOrientationNumber As Integer = 1 

        Dim vEXIF As String = "" 
        Dim vDirectories = ImageMetadataReader.ReadMetadata(file.InputStream) 
        Dim vSub = vDirectories.OfType(Of ExifSubIfdDirectory)().FirstOrDefault 
        If Not vSub Is Nothing Then 
         Dim vOrientationObj = vSub.GetObject(ExifDirectoryBase.TagOrientation) 
         If Not vOrientationObj Is Nothing Then 
          If Not vOrientationObj.Equals(DBNull.Value) Then 
           vOrientationNumber = Convert.ToInt16(vOrientationObj) 
          End If 
         End If 
        End If 

        For Each vDirectory In vDirectories 
         For Each Tag In vDirectory.Tags 
          vEXIF += vDirectory.Name & " " & Tag.Name & " " & Tag.Description & Environment.NewLine 
         Next 
        Next 

을 추가했지만 변수 VSUB는 항상 아무것도 없다. 나는이 이미지로 오리엔테이션 번호가 있다는 것을 알고있다. (메인 WPF 데스크탑 애플 리케이션에서 그것을 발견하고 그것을 회전시킬 때). 내가 지금 잘못하고있는 어떤 생각?

답변

1

MetadataExtractor는 메타 데이터를 파일에 쓰는 것을 지원하지 않습니다. 이는 인기있는 기능 요청이지만 제대로 수행하려면 (사람들이 파일을 덮어 쓰는 것이 분명 중요합니다) 약간의 작업이 필요합니다.

그러나이 작업을 수행하기 위해 라이브러리는 JPEG 파일을 다루는 한 유용한 코드를 제공합니다.

JPEG 파일은 기본적으로 소위 JPEG 세그먼트 목록입니다. Exif 데이터는 해당 세그먼트 중 하나에 있습니다. 따라서 원본 이미지에서 해당 세그먼트를 분리하면 크기를 조정 한 후에 대체 할 수 있습니다.

불행히도이 코드는 없습니다. JpegSegmentReader을 사용하여 필요한 세그먼트 (Exif는 JpegSegmentType.App1)를 추출 할 수 있습니다. 당신이보고있는


문자열 값은 설명입니다. subIfdorientation 모두 이미지에 따라 null이 될 수

var directories = ImageMetadataReader.ReadMetadata(imagePath); 

var subIfd = directories.OfType<ExifIfd0Directory>().FirstOrDefault(); 

int? orientation = subIfd?.GetObject(ExifDirectoryBase.TagOrientation); 

참고 : 원시 방향 값에 액세스하려면 다음과 같은 코드를 사용합니다.

저는 VB.NET을 잘 모르지만 C#입니다. 죄송합니다. 다행히도 그것은 당신을위한 간단한 전환입니다.

+0

더 많은 정보를 얻기 위해 https://drewnoakes.com/code/exif/sampleUsage.html 링크를 찾았지만 MetadataExtractor에서 JpegSegmentReader를 찾을 수 없습니다. 다른 클래스 이름 아래에 숨겨져 있습니까? – gchq

+0

'MetadataExtractor.Formats.Jpeg' 네임 스페이스에 있습니다. –

+0

방금 ​​전에 시행 착오로 그걸 발견했습니다 ..샘플 코드에서 'Dim segmentReader As New JpegSegmentReader (jpegFile)'에서 'No new is accessible'이라는 문구를 던집니다. 'Metadata Dim Metadata()에 메타 데이터가 있습니까?' – gchq