diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/views/editor_helpers.py | 65 |
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" |