Preserve IPTC metadata
See original GitHub issueThumbor request URL
http://ThumborDomain:8888/unsafe/600x0/https://OtherDomain/image.jpg
Expected behaviour
When I configure thumbor very basically and just indicate this parameter “PRESERVE_EXIF_INFO = True”, I should find the CopyrightNotice and Creator in the final image. CopyrightNotice is IPTC metadata. Is there a solution to preserve this metadata ?
Actual behaviour
Unfortunately this fields are not kept.
Operating system
CentOS 7.6 Python 2.7.5 Thumbor 6.7.5 and 7.0.0a5
Your thumbor.conf
# -*- coding: utf-8 -*-
from os.path import expanduser, join
home = expanduser("~")
# thumbor imaging service
# https://github.com/thumbor/thumbor/wiki
# Licensed under the MIT license:
# http://www.opensource.org/licenses/mit-license
# Copyright (c) 2011 globo.com thumbor@googlegroups.com
# the domains that can have their images resized
# use an empty list for allow all sources
ALLOWED_SOURCES = ['OtherDomain']
# the max width of the resized image
# use 0 for no max width
# if the original image is larger than MAX_WIDTH x MAX_HEIGHT,
# it is proportionally resized to MAX_WIDTH x MAX_HEIGHT
# MAX_WIDTH = 800
# the max height of the resized image
# use 0 for no max height
# if the original image is larger than MAX_WIDTH x MAX_HEIGHT,
# it is proportionally resized to MAX_WIDTH x MAX_HEIGHT
# MAX_HEIGHT = 600
# the quality of the generated image
# this option can vary widely between
# imaging engines and works only on jpeg images
#QUALITY = 85
#WEBP_QUALITY = 80
# Automatically converts images to WebP if Accepts header present
#AUTO_WEBP = False
# Automatically converts PNG to JPG if PNG has no transparency.
# WARNING: Depending on case, this is not a good deal. This
# transformation maybe causes distortions or the size of image can increase.
# Images with texts, for example, the result image maybe will be distorced.
# Dark images, for example, the size of result image maybe will be bigger.
# You have to evaluate the majority of your use cases to take a decision about this conf.
#AUTO_PNG_TO_JPG = False
# Specify the ratio between 1in and 1px for SVG images. This is only used when
# rasterizing SVG images having their size units in cm or inches.
# SVG_DPI = 150
# Preserves exif information in generated images. Increases image size in kbytes, use with caution.
PRESERVE_EXIF_INFO = True
# enable this options to specify client-side cache in seconds
MAX_AGE = 24 * 60 * 60
# client-side caching time for temporary images (using queued detectors or after detection errors)
MAX_AGE_TEMP_IMAGE = 0
# Sends If-Modified-Since & Last-Modified headers; requires support from result storage
SEND_IF_MODIFIED_LAST_MODIFIED_HEADERS = False
# the way images are to be loaded
LOADER = 'thumbor.loaders.http_loader'
#LOADER = 'thumbor.loaders.file_loader'
# the path to find images
#FILE_LOADER_ROOT_PATH = './tests/fixtures/images'
# maximum size of the source image in Kbytes.
# use 0 for no limit.
# this is a very important measure to disencourage very
# large source images.
# THIS ONLY WORKS WITH http_loader.
MAX_SOURCE_SIZE = 0
# if you set UPLOAD_ENABLED to True,
# a route /upload will be enabled for your thumbor process
# You can then do a put to this URL to store the photo
# using the specified Storage
UPLOAD_ENABLED = False
UPLOAD_PHOTO_STORAGE = 'thumbor.storages.file_storage'
UPLOAD_PUT_ALLOWED = False
UPLOAD_DELETE_ALLOWED = False
UPLOAD_DEFAULT_FILENAME = 'image'
# how to store the loaded images so we don't have to load
# them again with the loader
#STORAGE = 'thumbor.storages.redis_storage'
# STORAGE = 'thumbor.storages.no_storage'
STORAGE = 'thumbor.storages.file_storage'
#STORAGE = 'thumbor.storages.mixed_storage'
#STORAGE = 'thumbor.storages.memcache_storage'
# root path of the file storage
FILE_STORAGE_ROOT_PATH = join(home, 'thumbor', 'storage' )
# If you want to cache results, use this options to specify how to cache it
# Set Expiration seconds to ZERO if you want them not to expire.
RESULT_STORAGE = 'thumbor.result_storages.file_storage'
RESULT_STORAGE_EXPIRATION_SECONDS = 60 * 60 * 24 # one day
RESULT_STORAGE_FILE_STORAGE_ROOT_PATH = join(home, 'thumbor', 'result_storage')
RESULT_STORAGE_STORES_UNSAFE = False
# stores the crypto key in each image in the storage
# this is VERY useful to allow changing the security key
STORES_CRYPTO_KEY_FOR_EACH_IMAGE = True
#MEMCACHE_STORAGE_SERVERS = ['localhost:11211']
# imaging engine to use to process images
ENGINE = 'thumbor.engines.pil'
# if you need to use the OpenCV engine please refer
# to https://github.com/thumbor/opencv-engine
#ENGINE = 'opencv_engine'
# if you need to use the GraphicsMagick engine please refer
# to https://github.com/thumbor/graphicsmagick-engine
#ENGINE = 'graphicsmagick_engine'
# The graphics engine (and any optimizers) will block the IOLoop. If you want
# to increase the number of concurrent requests Thumbor can handle, increase
# ENGINE_THREADPOOLSIZE to use a thread pool. Benchmarks indicate 1xnumber of
# cpus - 2x number of cpus gives the best results, but do some benchmarks with
# your workload.
#ENGINE_THREADPOOL_SIZE = 0
# detectors to use to find Focal Points in the image
# more about detectors can be found in thumbor's docs
# at https://github.com/thumbor/thumbor/wiki
DETECTORS = [
#'thumbor.detectors.face_detector',
#'thumbor.detectors.profile_detector',
#'thumbor.detectors.glasses_detector',
#'thumbor.detectors.feature_detector',
]
# Redis parameters for queued detectors
# REDIS_QUEUE_SERVER_HOST = 'localhost'
# REDIS_QUEUE_SERVER_PORT = 6379
# REDIS_QUEUE_SERVER_DB = 0
# REDIS_QUEUE_SERVER_PASSWORD = None
# AWS SQS parameters for queued detectors
# SQS_QUEUE_KEY_ID = ''
# SQS_QUEUE_KEY_SECRET = ''
# SQS_QUEUE_REGION = 'us-east-1'
# if you use face detection this is the file that
# OpenCV will use to find faces. The default should be
# fine, so change this at your own peril.
# if you set a relative path it will be relative to
# the thumbor/detectors/face_detector folder
#FACE_DETECTOR_CASCADE_FILE = 'haarcascade_frontalface_alt.xml'
# this is the security key used to encrypt/decrypt urls.
# make sure this is unique and not well-known
# This can be any string of up to 16 characters
SECURITY_KEY = "MY_SECURE_KEY"
# if you enable this, the unencryted URL will be available
# to users.
# IT IS VERY ADVISED TO SET THIS TO False TO STOP OVERLOADING
# OF THE SERVER FROM MALICIOUS USERS
ALLOW_UNSAFE_URL = True
# Mixed storage classes. Change them to the fullname of the
# storage you desire for each operation.
#MIXED_STORAGE_FILE_STORAGE = 'thumbor.storages.file_storage'
#MIXED_STORAGE_CRYPTO_STORAGE = 'thumbor.storages.no_storage'
#MIXED_STORAGE_DETECTOR_STORAGE = 'thumbor.storages.no_storage'
# This configuration indicates whether thumbor should use a
# custom error handler.
# Defaults to: False
#USE_CUSTOM_ERROR_HANDLING=False
#ERROR_HANDLER_MODULE='thumbor.error_handlers.sentry'
#SENTRY_DSN_URL=''
#SENTRY_ENVIRONMENT=None
#FILTERS = [
#'thumbor.filters.brightness',
#'thumbor.filters.colorize',
#'thumbor.filters.contrast',
#'thumbor.filters.rgb',
#'thumbor.filters.round_corner',
#'thumbor.filters.quality',
#'thumbor.filters.noise',
#'thumbor.filters.watermark',
#'thumbor.filters.equalize',
#'thumbor.filters.fill',
#'thumbor.filters.saturation',
#'thumbor.filters.sharpen',
#'thumbor.filters.strip_exif',
#'thumbor.filters.strip_icc',
#'thumbor.filters.frame',
#'thumbor.filters.grayscale',
#'thumbor.filters.rotate',
#'thumbor.filters.format',
#'thumbor.filters.max_bytes',
#'thumbor.filters.no_upscale',
## can only be applied if there are already points for the image being served
## this means that either you are using the local face detector or the image
## has already went through remote detection
## 'thumbor.filters.redeye',
#]
#OPTIMIZERS = [
#'thumbor.optimizers.jpegtran',
#'thumbor.optimizers.gifv',
#]
#JPEGTRAN_PATH = '/usr/bin/jpegtran'
# If the CurlAsyncHTTPClient should be used
# Defaults to: False
#HTTP_LOADER_CURL_ASYNC_HTTP_CLIENT = False
# If the CurlAsyncHTTPClient is being used and
# should timeout on slow download speed.
# SPEED in bytes/s and TIME in s
# Dfaults to: 0 (no timeout)
#HTTP_LOADER_CURL_LOW_SPEED_TIME = 0
#HTTP_LOADER_CURL_LOW_SPEED_LIMIT = 0
Issue Analytics
- State:
- Created 3 years ago
- Comments:15 (5 by maintainers)
Top Results From Across the Web
how to preserve metadata Archives - IPTC
Photo metadata is key to protecting photographers' images, including copyright and licensing information online. The User Guide addresses typical questions such ...
Read more >What is IPTC metadata? Everything you need to know
IPTC metadata is the cornerstone of good image management and protection. It's incredibly useful for news agencies, museums, image archives ...
Read more >Preserving Metadata while Processing Images - Graphics Mill
Fortunately, Graphics Mill provides an elegant way to preserve metadata. ... Loads an image and associated EXIF, IPTC, XMP fields, and Adobe® image...
Read more >Preserving Metadata - Kraken.io
copyright, Will preserve copyright entries. The following tags will be preserved (if present): Exif.Image.Copyright Iptc.Application2.Copyright Xmp.dc.creator
Read more >How to preserve IPTC metadata of an image in python
Maybe more of a work-around, but you can extract and insert IPTC data with both exiftool and ImageMagick. That means you should be...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
@kkopachev Thanks for the update. Not sure if you’re the right person to be informed of this, but just an FYI: this will be an issue if you have any France based users that uses Thumbor to resize images that is then served to the public on the web. There is a law that was passed that requires the IPTC to be displayed and unmodified.
Link to law: https://www.legifrance.gouv.fr/codes/article_lc/LEGIARTI000038835832/2019-10-24 [legifrance.gouv.fr]
@scorphus Thanks so much, I had no idea that existed! I’m working on getting that wrapped in a dockerfile now. I see the thumbor version linked in your repo is 6.7.5, but isn’t 7.0 the first version supporting python 3+?