【问题标题】:Edit IPTC Metadata on Jpg vb.net在 Jpg vb.net 上编辑 IPTC 元数据
【发布时间】:2013-07-09 13:57:43
【问题描述】:

我需要将 IPTC 数据编辑为 jpg。

我用这段代码读取了它已有的关键字,但我无法编写新的关键字:

IPTC .NET read/write c# library

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Try

        Dim stream = New FileStream(imagepath, FileMode.Open, FileAccess.Read)
        Dim decoder = New JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None)
        Dim metadata = TryCast(decoder.Frames(0).Metadata, BitmapMetadata)
        If metadata IsNot Nothing Then
            Keywords.Text = metadata.Keywords.Aggregate(Function(old, val) Convert.ToString(old) & "; " & Convert.ToString(val))
        End If


    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub

任何帮助表示赞赏!谢谢

【问题讨论】:

    标签: .net vb.net jpeg iptc


    【解决方案1】:
        Dim stream = New FileStream(imagepath, FileMode.Open, FileAccess.Read)
        Dim decoder = New JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None)
        Dim metadata = TryCast(decoder.Frames(0).Metadata, BitmapMetadata)
        If metadata IsNot Nothing Then
            Keywords.Text = metadata.Keywords.Aggregate(Function(old, val) Convert.ToString(old) & "; " & Convert.ToString(val))
        End If
        Dim bitmapFrame = decoder.Frames(0)
        metadata = bitmapFrame.Metadata.Clone()
        metadata.Keywords = New ReadOnlyCollection(Of String)(New List(Of String)(New String() {"test1", "test2"}))
        Dim stream1 = New FileStream(imagepath1, FileMode.Create)
        Dim encoder = New JpegBitmapEncoder()
        encoder.Frames.Add(bitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metadata, bitmapFrame.ColorContexts))
        encoder.Save(stream1)
    

    更新 新代码替换图像。

    Imports System.Windows.Media.Imaging
    Imports System.IO
    Imports System.Collections.ObjectModel
    Class MainWindow
        Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
            Dim imagepath = ".\img.jpg" ' path to file
            Dim stream = New FileStream(imagepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
            Dim decoder = New JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.None)
            Dim metadata = TryCast(decoder.Frames(0).Metadata, BitmapMetadata)
            If metadata IsNot Nothing Then
                Keywords.Text = metadata.Keywords.Aggregate(Function(old, val) Convert.ToString(old) & "; " & Convert.ToString(val))
            End If
            Description.Text = metadata.GetQuery("/app13/irb/8bimiptc/iptc/Caption") 'get description
            Dim bitmapFrame = decoder.Frames(0)
            metadata = bitmapFrame.Metadata.Clone()
            Dim newkeywords As New List(Of String)(New String() {"test1", "test2"})
            newkeywords.AddRange(metadata.Keywords) ' this strin adds old keywords
            metadata.Keywords = New ReadOnlyCollection(Of String)(newkeywords) 'replace keywords
            metadata.SetQuery("/app13/irb/8bimiptc/iptc/Caption", "My test picture1.") ' set new description
            Dim memstream As New MemoryStream() ' create temp storage in memory
            Dim encoder = New JpegBitmapEncoder()
            encoder.Frames.Add(bitmapFrame.Create(bitmapFrame, bitmapFrame.Thumbnail, metadata, bitmapFrame.ColorContexts))
            encoder.Save(memstream) ' save in memory
            stream.Close()
            stream = New FileStream(imagepath, FileMode.Open, FileAccess.Write, FileShare.ReadWrite)
            memstream.Seek(0, System.IO.SeekOrigin.Begin) ' go to stream start
            Dim bytes(memstream.Length) As Byte
            memstream.Read(bytes, 0, memstream.Length)
            stream.Write(bytes, 0, bytes.Length)
            stream.Close()
            memstream.Close()
        End Sub
    End Class
    

    jpeg 元数据here.
    IPTC 字段here

    【讨论】:

    • 也许如果你能稍微解释一下你的代码,它会对 OP 有更多帮助并帮助他学习……顺便说一句,干得好!
    • 对不起,我想我现在不明白你的意思。 OP 正在寻求一种将新关键字写入(我想添加)到现有文件的方法。例如,他有一张房子的照片,并想将关键字房子、花园、门、窗等添加到文件中。这就是您发布的代码的作用吗?不写文件是什么意思?
    • 好的。我刚刚开始思考前面的问题。 :) 只需删除这个字符串:newkeywords.AddRange(metadata.Keywords)
    • 我添加了一些关于元数据和读写元数据的行的信息。
    • @Justme,对不起。我很忙。设置行: Dim newkeywords As New List(Of String)(New String() {"test1", "test2"}) as Dim newkeywords As New List(Of String)({""}) 并删除 newkeywords.AddRange(metadata .Keywords) ' 这个字符串添加旧的关键字
    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多