0

MVC アプリケーションを使用して画像をアップロードする場合、DB に保存する前にファイル サイズを小さくする必要がありますが、EXIF データを保持したいのです。次に、MetadataExtractor を使用して、サイズ変更されたものに追加します

このようなメタデータを取得できます

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

次に、このように画像のサイズを変更します

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

したがって、メタデータを辞書として保存し、サイズを縮小した画像ファイルを変数 vImageFile として保存できるようになりました...

問題は、そのメタデータを新しいファイルに戻すにはどうすればよいかということです。

ありがとうございました

------------------- 2017 年 10 月 1 日に編集を追加 --------------------

このコードを追加しました

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

Orientation 番号のハンドルを取得しますが、変数 vSub は常に Nothing です。この画像で方向番号があることがわかります(メインのWPFデスクトップアプリで見つけて回転させるため)。私が今間違っている可能性があることは何ですか?

4

1 に答える 1