我很擅长编写代码(C#或python),而且我在更改代码以处理多个项目时遇到问题。我认为,因为C#PropertyItem类没有构造函数,所以你必须首先获取现有图像的属性项然后更改它并分配给新图像。
如果您不确定我所指的是什么,请在评论中查看。
https://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem(v=vs.110).aspx
在任何一种情况下,以下代码都可以对单个图像进行更改。
import sys
sys.path.append(r'C:\Python27\DLLs')
sys.path.append(r'C:\Python27\Lib')
import os
import clr
clr.AddReference('System.Drawing')
from System.Drawing import Image
import System.Text
objImageB = Image.FromFile('C:\Temp\Test.jpg')
propitems = objImageB.PropertyItems
item = propitems[0]
tag = 'MyTag'
data = System.Text.ASCIIEncoding.Unicode.GetBytes(tag)
data[data.Length -1]
item.Type = 1
item.Id = 40092
item.Len = data.Length
item.Value = data
objImageB.SetPropertyItem(item)
objImageB.Save('C:\Temp\Test2.jpg', System.Drawing.Imaging.ImageFormat.Jpeg)
但是,我想要为代码提供一个图像列表,并让它为标记分配一个值列表,1到1.所以一个与标签列表长度相同的图像列表,这就是我遇到麻烦的地方,特别是创建属性项目,正如我在上面代码的第15-22行所做的那样。
例如: Image 1.jpg Image 2.jpg Image 3.jpg
将具有以下关联值: 这个,那个,其他 This2,That2,其它2 This3,That3,Other3
我已经开始创建一些代码,用于创建我想要开始的值列表,但不知道在那之后去哪里创建每个图像的属性项,然后分配它并保存每个图像。
这是我开始的代码,如果它有帮助,但我可能偏离轨道,所以不要让它绕开你的答案,如果是这样。
import sys
sys.path.append(r'C:\Python27\DLLs')
sys.path.append(r'C:\Python27\Lib')
import os
import os.path
from itertools import *
import clr
clr.AddReference('System.Drawing')
from System.Drawing import Image
import System.Text
fstring = []
for i in IN[0]:
fstring.append(str(i))
images = []
for i in fstring:
images.append(Image.FromFile(i))
fnames = []
for i in IN[0]:
fnames.append(os.path.basename(i))
tags = []
for i in IN[1]:
tags.append(i)
propitems = []
for i in images:
propitems.append(i.PropertyItems)
#item = [i[0] for i in propitems]
pitem = propitems[0][0]
data = []
for i in tags:
data.append(System.Text.ASCIIEncoding.Unicode.GetBytes(i))
作为参考,我使用的是名为dynamo的架构程序,它使用铁蟒。它是一个可视化脚本程序,IN [0]和IN [1]将成为输入,IN [0]是图像列表,IN [1]是我想要分配给它的字符串列表。评论每个图像的元数据。
最后,由于我上面使用的程序,我仅限于IronPython 2.7。我没有找到一种方法来使用Pillow和Python来完成这项工作,我想我只是坚持使用C#方式在IronPython中完成它。
提前感谢您的帮助!