summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/views/editor_helpers.py65
1 files changed, 45 insertions, 20 deletions
diff --git a/core/views/editor_helpers.py b/core/views/editor_helpers.py
index 01e526b..ca2b838 100644
--- a/core/views/editor_helpers.py
+++ b/core/views/editor_helpers.py
@@ -39,7 +39,14 @@ def get_dir(path):
else:
return ""
-
+def insert_gps_data(image_path, gps_data):
+ """Function to insert GPS data into the resized image
+ """
+ exif_dict = piexif.load(image_path)
+ exif_dict['GPS'] = gps_data
+ exif_bytes = piexif.dump(exif_dict)
+ piexif.insert(exif_bytes, image_path)
+
def image_selector(request, path):
"""Returns available images
called from
@@ -70,7 +77,9 @@ def image_selector(request, path):
def reorient_image(img, exif_dict):
if piexif.ImageIFD.Orientation in exif_dict["0th"]:
- print(exif_dict)
+ # print(f"reorient_image(): found ImageIFD.Orientation in 0th ")
+ # for ifd in exif_dict:
+ # print(f"reorient_image(): \"{ifd}\"\n {exif_dict[ifd]} ")
orientation = exif_dict["0th"].pop(piexif.ImageIFD.Orientation)
if orientation == 2:
@@ -92,45 +101,51 @@ def reorient_image(img, exif_dict):
@login_required_if_public
def new_image_form(request, path):
- """Manages a form to upload new images"""
+ """Manages a form to upload new images
+
+ exif_dict = piexif.load(im.info["exif"])
+ exif_dict = {"0th":zeroth_ifd, "Exif":exif_ifd, "GPS":gps_ifd}
+
+ The "Exif.Image.NewSubfileType" tag (ID 41729) serves to identify
+ the type of image or subfile data contained in the image file
+ 0: full resolution, 1: reduced resolution
+
+ """
directory = get_dir(path)
print(f"new_image_form(): {directory=} {path=}")
editor = get_cookie(request)
if request.method == "POST":
- print(f"new_image_form(): POST ")
+ # print(f"new_image_form(): POST ")
form = NewWebImageForm(request.POST, request.FILES, directory=directory)
if form.is_valid():
- print(f"new_image_form(): form is valid ")
- print(f"new_image_form(): files: {request.FILES['file_']}")
+ # print(f"new_image_form(): form is valid ")
editor = form.cleaned_data["who_are_you"]
editor = git_string(editor)
f = request.FILES["file_"]
binary_data = io.BytesIO()
for chunk in f.chunks():
binary_data.write(chunk)
- print(f"new_image_form(): binary chnks written")
i = Image.open(binary_data)
- print(f"new_image_form(): {i=}")
if "exif" in i.info:
- print(f"new_image_form(): exif: {i=}")
-
exif_dict = piexif.load(i.info["exif"])
+ gps_data = exif_dict['GPS']
+ # print(f"new_image_form() EXIF loaded from {f.name}\n {gps_data=}")
i = reorient_image(i, exif_dict)
- exif_dict['Exif'][41729] = b'1'
+ exif_dict['Exif'][41729] = b'1' # I am not sure this should be binary..
# can crash here with bad exif data
try:
+ # This is never written back into the images ?!!
exif = piexif.dump(exif_dict)
+ # int(f"new_image_form() After DUMP {exif=}")
except:
exif = None
else:
exif = None
- print(f"new_image_form(): No exif problems")
width, height = i.size
- print(f"new_image_form(): {i.size=}")
+ # print(f"new_image_form(): {i.size=}")
if width > MAX_IMAGE_WIDTH or height > MAX_IMAGE_HEIGHT:
- print(f"new_image_form(): rescaling ")
scale = max(width / MAX_IMAGE_WIDTH, height / MAX_IMAGE_HEIGHT)
print(f"new_image_form(): rescaling {scale=}")
try:
@@ -143,10 +158,20 @@ def new_image_form(request, path):
thumbnail = i.resize((int(width / tscale), int(height / tscale)), Image.LANCZOS)
ib = io.BytesIO()
i = i.convert('RGB')
- i.save(ib, format="jpeg", quality = 75)
+
+ exif_dict = piexif.load(i.info["exif"])
+ exif_dict['GPS'] = gps_data # saved from before
+ exif_bytes = piexif.dump(exif_dict)
+ ib = io.BytesIO()
+ i.save(ib, format='JPEG', quality = 85, exif=exif_bytes)
+
tb = io.BytesIO()
thumbnail = thumbnail.convert('RGB')
- thumbnail.save(tb, format="jpeg", quality = 70)
+ exif_dict = piexif.load(thumbnail.info["exif"])
+ exif_dict['GPS'] = gps_data # saved from before
+ exif_bytes = piexif.dump(exif_dict)
+ thumbnail.save(tb, format='JPEG', quality = 70, exif=exif_bytes)
+
image_rel_path, thumb_rel_path, desc_rel_path = form.get_rel_paths()
print(f"new_image_form(): \n {image_rel_path=}\n {thumb_rel_path=}\n {desc_rel_path=}")
image_page_template = loader.get_template("image_page_template.html")
@@ -187,12 +212,12 @@ def new_image_form(request, path):
{"thumbnail_url": f"/{thumb_rel_path}", "page_url": f"/{desc_rel_path}"}, request
)
j_response = JsonResponse({"html": html_snippet})
- j_response.set_cookie('editor_id', editor, max_age=COOKIE_MAX_AGE) # does not seem to work updating who_are_you cookie
+ j_response.set_cookie('editor_id', editor, max_age=COOKIE_MAX_AGE) # does NOT seem to work updating who_are_you cookie
return j_response
else:
- print(f"new_image_form(): not POST ")
+ # print(f"new_image_form(): not POST ")
form = NewWebImageForm(directory=directory, initial={"who_are_you":editor})
- print(f"new_image_form(): POST and not POST ")
+ # print(f"new_image_form(): POST and not POST ")
template = loader.get_template("new_image_form.html")
htmlform = template.render({"form": form, "path": path}, request)
return JsonResponse({"form": htmlform})
@@ -250,7 +275,7 @@ class NewWebImageForm(forms.Form):
class HTMLarea(forms.Textarea):
"""This is called from CaveForm in core/forms.py which is called from core/views/caves.py when editing a cave description
- (and similarly for Entrance Descriptions). It is alls called from core/views/expo.py when editing expo (i.e. handbook) pages.
+ (and similarly for Entrance Descriptions). It is also called from core/views/expo.py when editing expo (i.e. handbook) pages.
"""
template_name = "widgets/HTMLarea.html"