Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python将自定义元数据写入JPEG?_Python_Python Imaging Library_Exif - Fatal编程技术网

如何使用Python将自定义元数据写入JPEG?

如何使用Python将自定义元数据写入JPEG?,python,python-imaging-library,exif,Python,Python Imaging Library,Exif,如何使用Python将自定义元数据写入JPEG 我试过了 import piexif exif_dict = { 'uwi': myvalue1, 'activity_type': myvalue2, 'prediction': myvalue3, 'url_current': myvalue4, 'url_previous': mava

如何使用Python将自定义元数据写入JPEG

我试过了

import piexif
exif_dict = {
                'uwi': myvalue1,
                'activity_type': myvalue2,
                'prediction': myvalue3,
                'url_current': myvalue4,
                'url_previous': mavalue5
            }
exif_bytes = piexif.dump(exif_dict)
with open(filename, "w") as fp:
    test_image.save(fp, "JPEG", exif=exif_bytes)
但是在使用
XnView
的图像中看不到任何内容。我做错了什么

另外,我不需要写相机模型、曝光和其他东西。我想编写自己的自定义元数据。

查看如何使用piexif。例如,您所做的错误是试图编写自定义元数据并使用open打开文件,而不是使用PIL模块中的Image打开文件

从文档中缩减示例,您可以执行以下操作:

from PIL import Image
import piexif

zeroth_ifd = {
              piexif.ImageIFD.Make: u"Canon",
              piexif.ImageIFD.XResolution: (96, 1),
              piexif.ImageIFD.YResolution: (96, 1),
              piexif.ImageIFD.Software: u"piexif"
              }
exif_ifd = {
            piexif.ExifIFD.DateTimeOriginal: u"2099:09:29 10:10:10",
            piexif.ExifIFD.LensMake: u"LensMake",
            piexif.ExifIFD.Sharpness: 65535,
            piexif.ExifIFD.LensSpecification: ((1, 1), (1, 1), (1, 1), (1, 1)),
            }
gps_ifd = {
           piexif.GPSIFD.GPSVersionID: (2, 0, 0, 0),
           piexif.GPSIFD.GPSAltitudeRef: 1,
           piexif.GPSIFD.GPSDateStamp: u"1999:99:99 99:99:99",
           }
first_ifd = {
             piexif.ImageIFD.Make: u"Canon",
             piexif.ImageIFD.XResolution: (40, 1),
             piexif.ImageIFD.YResolution: (40, 1),
             piexif.ImageIFD.Software: u"piexif"
             }

exif_dict = {"0th":zeroth_ifd, "Exif":exif_ifd, "GPS":gps_ifd, "1st":first_ifd, "thumbnail":thumbnail}
exif_bytes = piexif.dump(exif_dict)
im = Image.open("foo.jpg")
im.save("out.jpg", exif=exif_bytes)

您可以检查所有可以使用piexif编辑的元数据字段。

我找不到关于自定义标记的明确答案(建议您可以使用第三方工具),但查看只提供定义的标记,因此我将说不,您不能创建自己的元数据标记,至少不能直接创建


因此,您可以将自己的数据写入任何标记。最好使用这个标签——大多数相机制造商都有自己的自定义元数据。将自定义标志转储到字节字符串中,然后再将其填充到MakerNote标记中:

from PIL import Image
import piexif
import pickle

tags = {'url_current'   : 'https://stackoverflow.com/q/52729428/1846249',
        'contains_fish' : False,
        3               : 0.14159265358979323, }

data = pickle.dumps(tags)
exif_ifd = {piexif.ExifIFD.MakerNote: data}

exif_dict = {"0th": {}, "Exif": exif_ifd, "1st": {},
             "thumbnail": None, "GPS": {}}

img = Image.new('RGB', (500, 500), 'green')
exif_dat = piexif.dump(exif_dict)
img.save('image.jpg',  exif=exif_dat)
因为它是您自己的格式,所以您需要自己重新阅读:

img = Image.open('image.jpg')
raw = img.getexif()[piexif.ExifIFD.MakerNote]
tags = pickle.loads(raw)
exiftool将看到该图像具有MakerNote,但无法识别它:

C:\> exiftool image.jpg -MakerNote
Warning: [minor] Unrecognized MakerNotes - image.jpg
您还可以将其存储在UserComment标记中—存储的方式与此相同

C:\>exiftool image.jpg -UserComment
User Comment                    : Ç.ò^}ö(î.url_currentöî,https://stackoverflow.com/q/52729428/1846249öî.contains_fishöëK.G?┬.╡DB╤äu.

另外,jpeg图像中的元数据大小为64kB

,但是否可以将自定义元数据保存为jpeg格式?我不想保存相机模型等,这对我来说是不必要的。而且我没有打开现有的图像,我正在创建自己的图像。这是否回答了你的问题?