René's URL Explorer Experiment


Title: thumbspage - User/Developer Guide

Mail addresses
lutz@learning-python.com
lutz@learning-python.com
lutz@learning-python.com
lutz@learning-python.com

direct link

Domain: learning-python.com

Nonetext/html; charset=UTF-8

Links:

https://learning-python.com/trnpix/index-dynamic.html
changeshttps://learning-python.com/thumbspage/UserGuide.html#Version History
learning-python.comhttps://learning-python.com/
thumbspagehttps://learning-python.com/thumbspage.html#Download
Python 3.Xhttps://www.python.org/downloads/
Pillowhttps://pillow.readthedocs.io/en/stable/installation/index.html
web pagehttps://www.learning-python.com/thumbspage.html
live demohttps://learning-python.com/thumbspage/examples/3.0-upgrades/index.html
screenshotshttps://learning-python.com/thumbspage/examples/3.0-screenshots/index.html
clienthttps://learning-python.com/trnpix/index-dynamic.html
cautionhttps://learning-python.com/thumbspage/UserGuide.html#Usage Caution
demohttps://learning-python.com/thumbspage.html#demos
exampleshttps://learning-python.com/thumbspage/examples/
codehttps://learning-python.com/thumbspage/
casehttp://learning-python.com/trnpix/index-dynamic.html
web pagehttps://learning-python.com/thumbspage.html
3.0 Quick Starthttps://learning-python.com/thumbspage/UserGuide.html#Quickstart30
Overviewhttps://learning-python.com/thumbspage/UserGuide.html#Overview
Viewing Gallerieshttps://learning-python.com/thumbspage/UserGuide.html#Viewing Galleries
Index Pageshttps://learning-python.com/thumbspage/UserGuide.html#Index Pages
Viewer Pageshttps://learning-python.com/thumbspage/UserGuide.html#Viewer Pages
Viewing Tipshttps://learning-python.com/thumbspage/UserGuide.html#Viewing Tips
Building Gallerieshttps://learning-python.com/thumbspage/UserGuide.html#Building Galleries
Installs and Platformshttps://learning-python.com/thumbspage/UserGuide.html#Installs and Platforms
Running thumbspagehttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
Customizationhttps://learning-python.com/thumbspage/UserGuide.html#Customization
Building Tipshttps://learning-python.com/thumbspage/UserGuide.html#Building Tips
GUI Modehttps://learning-python.com/thumbspage/UserGuide.html#GUI Mode
Usage Cautionhttps://learning-python.com/thumbspage/UserGuide.html#Usage Caution
Version Historyhttps://learning-python.com/thumbspage/UserGuide.html#Version History
3.0.1: Android Chrome Fixhttps://learning-python.com/thumbspage/UserGuide.html#3.0.1
3.0: Tags, Keys, Swipeshttps://learning-python.com/thumbspage/UserGuide.html#3.0
2.3: Notes, Inputshttps://learning-python.com/thumbspage/UserGuide.html#2.3
2.2: Swipes, Configshttps://learning-python.com/thumbspage/UserGuide.html#2.2
2.1: Thumbs, Layouthttps://learning-python.com/thumbspage/UserGuide.html#2.1
2.0: Auto, Top, Fullhttps://learning-python.com/thumbspage/UserGuide.html#2.0
1.7: Info, Exifs, Etc.https://learning-python.com/thumbspage/UserGuide.html#1.7
1.6: Scaling, Rotationhttps://learning-python.com/thumbspage/UserGuide.html#1.6
1.5: Viewer Pageshttps://learning-python.com/thumbspage/UserGuide.html#1.5
1.4: Mobilehttps://learning-python.com/thumbspage/UserGuide.html#1.4
1.3: Unicodehttps://learning-python.com/thumbspage/UserGuide.html#1.3
1.2: Stylinghttps://learning-python.com/thumbspage/UserGuide.html#1.2
1.1: Subfoldershttps://learning-python.com/thumbspage/UserGuide.html#1.1
1.0: The Basicshttps://learning-python.com/thumbspage/UserGuide.html#1.0
Development Noteshttps://learning-python.com/thumbspage/UserGuide.html#Development Notes
More Resourceshttps://learning-python.com/thumbspage/UserGuide.html#More Resources
3.0https://learning-python.com/thumbspage/UserGuide.html#3.0
demohttps://learning-python.com/thumbspage/examples/3.0-upgrades/index.html
screenshothttps://learning-python.com/thumbspage/examples/3.0-screenshots/index.html
index pagehttps://learning-python.com/thumbspage/examples/3.0-upgrades/index.html
viewer pagehttps://learning-python.com/thumbspage/examples/3.0-upgrades/_thumbspage/z-explicitly-first.jpg.html
folderhttps://learning-python.com/thumbspage.html#Download
Python 3.Xhttps://www.python.org/downloads
Pillowhttps://pillow.readthedocs.io/en/stable/installation/index.html
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
aheadhttps://learning-python.com/thumbspage/UserGuide.html#Customization
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
buildhttps://learning-python.com/thumbspage/examples/3.0-upgrades/_generate.sh
publishhttps://learning-python.com/thumbspage/examples/3.0-upgrades/_publish.sh
galleryhttps://learning-python.com/trnpix/index-dynamic.html
customizedhttps://learning-python.com/site-mobile-screenshots/index.html
browserhttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-no-ios13-hidetoolbar2.jpeg
index pagehttps://learning-python.com/thumbspage/examples/unicode/images/index.html
flavorshttps://learning-python.com/thumbspage/examples/dynamiclayout/index.html
displayhttps://learning-python.com/thumbspage/examples/unicode/images/%E7%9C%9F%E6%A3%92%E7%85%A7%E7%89%87.JPG
viewer pageshttps://learning-python.com/thumbspage/examples/unicode/images/_thumbspage/%E7%9C%9F%E6%A3%92%E7%85%A7%E7%89%87.JPG.html
slideshowshttps://learning-python.com/thumbspage/examples/2.1-upgrades/Q-auto-slideshow-on-indicator.png
fullscreenhttps://learning-python.com/thumbspage/examples/2.1-upgrades/Z-2.1-viewer-pages-5-fullscreen.png
popupshttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d4-info-on-top.png
popupshttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d3-short.png
enabledhttps://learning-python.com/thumbspage/examples/2.3-upgrades/btns-d4-all-on.png
toohttps://learning-python.com/thumbspage/UserGuide.html#viewerswipes
desktophttps://learning-python.com/thumbspage/examples/2.0-upgrades/javascript-desktop-viewpage-on.png
mobilehttps://learning-python.com/thumbspage/examples/2.0-upgrades/javascript-mobile-viewpage-on.jpg
aheadhttps://learning-python.com/thumbspage/UserGuide.html#Building Galleries
subfoldershttps://learning-python.com/thumbspage/examples/mixedtypes/index.html
pagehttps://learning-python.com/cgi/showcode.py?name=trnpix/index-dynamic.html
subfolderhttps://learning-python.com/trnpix/_thumbspage/
pageshttps://learning-python.com/cgi/showcode.py?name=trnpix/_thumbspage/2023 Sync App.jpg.html
galleryhttps://learning-python.com/trnpix/
Ziphttp://learning-python.com/ziptools.html
websitehttp://learning-python.com
demoshttps://learning-python.com/thumbspage.html#demos
scriptshttps://learning-python.com/thumbspage/build/
interactionhttps://learning-python.com/thumbspage/examples/console-logs/android.txt
lineshttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
linkshttps://learning-python.com/thumbspage/examples/__prior-version-items/__prior-screenshots/older/trnpix-1.1.png
extensionshttps://learning-python.com/thumbspage/examples/3.0-screenshots/_thumbspage/index-light.png.html
pageshttps://learning-python.com/thumbspage/examples/3.0-screenshots/_thumbspage/viewer-wraparound.png.html
noteshttps://learning-python.com/thumbspage/examples/3.0-screenshots/_thumbspage/viewer-note-tags.png.html
messageshttps://learning-python.com/thumbspage/examples/3.0-screenshots/_thumbspage/viewer-rawview.png.html
captionshttps://learning-python.com/thumbspage/examples/3.0-screenshots/_thumbspage/viewer-captions.png.html
modehttps://learning-python.com/thumbspage/examples/3.0-screenshots/_thumbspage/index-page.png.html
buttonhttps://learning-python.com/thumbspage/examples/2.3-upgrades/btns-d4-all-on.png
descriptionhttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d1-large.png
enabledhttps://learning-python.com/thumbspage/UserGuide.html#viewerswipes
labelshttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/xx-omit-labels-mobile-i.png.html
enabledhttps://learning-python.com/thumbspage/examples/2.3-upgrades/tooltips4.png
inputshttps://learning-python.com/thumbspage/UserGuide.html#inputs23
morehttps://learning-python.com/thumbspage/UserGuide.html#2.3
viewhttps://learning-python.com/thumbspage.html#demos
settingshttps://learning-python.com/thumbspage/examples/2.2-upgrades/more-demos/config-args-demo.sh
pageshttps://learning-python.com/thumbspage/examples/2.2-upgrades/tooltips-gallery/index.html
morehttps://learning-python.com/thumbspage/UserGuide.html#2.2
presetshttps://learning-python.com/thumbspage/user_configs.py
blurhttps://learning-python.com/thumbspage/examples/2.1-upgrades/_thumbspage/F-normzoom-2.0-vs-2.1-presets-2.png.html
modehttps://learning-python.com/thumbspage/examples/2.1-upgrades/_thumbspage/X-black-and-white-thumbs-mode.png.html
debutshttps://learning-python.com/thumbspage/examples/dynamiclayout/index.html
automated. As of 2.0, viewer pages gain an Auto button that toggles automatic slideshows, a Full that toggles one-page fullscreen, and custom dialogs and device lines for info popups; index pages sprout floating Top buttons; and all pages have improved styling for handling rare page overflows. As of 1.7, viewer pages open info popups on filename taps and browser-native views on image taps, avoid clipping for large fonts, and drop hover effects spotty on mobile; and GIFs get better thumbs, rotations keep and update Exif tags, and iOS landscape images are scaled. As of 1.6, JavaScript is used to dynamically scale viewer-page images without changing aspect ratio or overflowing pages, and tilted images are automatically rotated to display right-side up. Earlier releases added formatted image-viewer pages [1.5]; support for viewing galleries on mobile devices [1.4]; support for filename and content Unicode [1.3]; and more. https://learning-python.com/thumbspage/build
slideshowshttps://learning-python.com/thumbspage/examples/2.0-upgrades/auto-slideshow-view-normalfont.png
fullscreenhttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-mobile-fson.jpg
info popupshttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-spacemonkey1.png
Top buttonshttps://learning-python.com/thumbspage/examples/2.0-upgrades/floating-top-custom-midpage.png
overflowshttps://learning-python.com/thumbspage/examples/2.0-upgrades/overflow-wrap-index-foldername.png
filename tapshttps://learning-python.com/thumbspage/examples/1.7-upgrades/digitized-other-photo2.jpg
image tapshttps://learning-python.com/thumbspage/examples/1.7-upgrades/image-tap-raw.png
large fontshttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-clip-fixed-large.png
thumbshttps://learning-python.com/thumbspage/examples/1.7-upgrades/zz-gif-thumbs-after-rbga.png
Exif tagshttps://learning-python.com/thumbspage/examples/reorientation/_thumbspage/galaxys8-3U.jpg.html
scaledhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hid-landscape.PNG
dynamically scalehttps://learning-python.com/thumbspage/examples/Screenshots/_thumbspage/scaling-portrait-tall.png.html
automatically rotatedhttps://learning-python.com/thumbspage/examples/reorientation/index.html
image-viewer pageshttps://learning-python.com/thumbspage/examples/Screenshots/_thumbspage/colors-viewer.png.html
mobile deviceshttps://learning-python.com/thumbspage/examples/Screenshots/_thumbspage/trnpix-index-mobile.png.html
Unicodehttps://learning-python.com/thumbspage/examples/unicode/images/_thumbspage/Марк Лутц.JPG.html
aheadhttps://learning-python.com/thumbspage/UserGuide.html#Version History
builders' sectionhttps://learning-python.com/thumbspage/UserGuide.html#Building Galleries
desktophttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d2-thin.png
mobilehttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-m1-portrait.png
onlinehttps://learning-python.com/thumbspage/examples/2.0-upgrades/auto-slideshow-view-android6inch-1.jpg
offlinehttps://learning-python.com/thumbspage/examples/2.1-upgrades/Z-2.1-viewer-pages-1.png
aheadhttps://learning-python.com/thumbspage/UserGuide.html#Viewing Tips
desktophttps://learning-python.com/thumbspage/examples/2.2-upgrades/misc-gallery/thumbs-border-2.2-a-fixed.png
mobilehttps://learning-python.com/thumbspage/examples/2.2-upgrades/misc-gallery/thumbs-border-2.2-c-mobile.png
versionhttps://learning-python.com/trnpix/index-dynamic.html
basenamehttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-other-unicode-index.png
subfoldershttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-other-subfolders.png
Tophttps://learning-python.com/thumbspage/examples/2.0-upgrades/floating-top-custom-footer.png
subfoldershttps://learning-python.com/thumbspage/examples/mixedtypes/index.html
aheadhttps://learning-python.com/thumbspage/UserGuide.html#1.1
mouseovershttps://learning-python.com/thumbspage/examples/2.2-upgrades/tooltips-gallery/firefox-index-thumb.png
fixedhttps://learning-python.com/trnpix/index.html
dynamichttps://learning-python.com/trnpix/index-dynamic.html
demohttps://learning-python.com/thumbspage/examples/dynamiclayout/index.html
viewer pageshttps://learning-python.com/thumbspage/examples/2.1-upgrades/Z-2.1-viewer-pages-1.png
desktophttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-desktop.png
mobilehttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-mobile-android6inch-1.jpg
versionhttps://learning-python.com/trnpix/_thumbspage/2010 Sarasota 1.JPG.html
mouseovershttps://learning-python.com/thumbspage/examples/2.3-upgrades/tooltips4.png
info dialoghttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-mobile-android6inch-info.jpg
scanhttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-scanner2.png
raw displayhttps://learning-python.com/thumbspage/examples/2.0-upgrades/auto-slideshow-view-raw-imagetap.jpg
aheadhttps://learning-python.com/thumbspage/UserGuide.html#viewerswipes
toolbar buttonshttps://learning-python.com/thumbspage/examples/2.3-upgrades/btns-d4-all-on.png
index pagehttps://learning-python.com/thumbspage/examples/2.0-upgrades/floating-top-mobile-android6inch-prescroll.jpg
viewer pageshttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d1-large.png
buttonhttps://learning-python.com/thumbspage/examples/2.3-upgrades/btns-d4-all-on.png
line-throughhttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-x1-none.png
screenshttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-m1-portrait.png
galleryhttps://learning-python.com/thumbspage/examples/2.0-upgrades/auto-slideshow-view-android6inch-1.jpg
aheadhttps://learning-python.com/thumbspage/UserGuide.html#moresafarijunk
2.1https://learning-python.com/thumbspage/UserGuide.html#21autofull
is onhttps://learning-python.com/thumbspage/examples/2.1-upgrades/Q-auto-slideshow-on-indicator.png
is offhttps://learning-python.com/thumbspage/examples/2.1-upgrades/Q-auto-slideshow-off-indicator.png
togglehttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-mobile-fson.jpg
beforehttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-windows-fsoff.png
afterhttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-windows-fson.png
tiphttps://learning-python.com/thumbspage/UserGuide.html#fullscreenmanual
is onhttps://learning-python.com/thumbspage/examples/2.1-upgrades/Z-2.1-viewer-pages-5-fullscreen.png
2.2https://learning-python.com/thumbspage/UserGuide.html#2.2
3.0https://learning-python.com/thumbspage/UserGuide.html#3.0
Quick Starthttps://learning-python.com/thumbspage/UserGuide.html#aboutswipes
dialoghttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-mobile-android6inch-info.jpg
filenamehttps://learning-python.com/thumbspage/UserGuide.html#widgetactions
popuphttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d1-large.png
abovehttps://learning-python.com/thumbspage/UserGuide.html#notebutton
raw viewhttps://learning-python.com/thumbspage/examples/2.0-upgrades/auto-slideshow-view-raw-imagetap.jpg
imagehttps://learning-python.com/thumbspage/UserGuide.html#widgetactions
popuphttps://learning-python.com/thumbspage/examples/2.2-upgrades/misc-gallery/up-swipe-fail-chrome.jpg
aheadhttps://learning-python.com/thumbspage/UserGuide.html#chromeupswipebug22
galleryhttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-windows-fsoff.png
buttonshttps://learning-python.com/thumbspage/UserGuide.html#toolbaractions
timehttps://learning-python.com/thumbspage/UserGuide.html#swipegestures22
herehttps://learning-python.com/thumbspage.html#demos
abovehttps://learning-python.com/thumbspage/UserGuide.html#widgetactions
exampleshttps://learning-python.com/thumbspage/examples/
live demoshttps://learning-python.com/thumbspage.html#demos
JavaScript requirementhttps://learning-python.com/thumbspage/UserGuide.html#_vt1
Browser and device supporthttps://learning-python.com/thumbspage/UserGuide.html#_vt2
Enable iOS 13's Hide Toolbar for Safarihttps://learning-python.com/thumbspage/UserGuide.html#_vt3
Fullscreen manual optionshttps://learning-python.com/thumbspage/UserGuide.html#_vt4
iOS Chrome may stack navigation historyhttps://learning-python.com/thumbspage/UserGuide.html#_vt5
Viewing galleries offline on PCshttps://learning-python.com/thumbspage/UserGuide.html#_vt9
Viewing galleries offline on Androidhttps://learning-python.com/thumbspage/UserGuide.html#_vt7
Viewing galleries offline on iOS?https://learning-python.com/thumbspage/UserGuide.html#_vt8
Beware browser settings and bugshttps://learning-python.com/thumbspage/UserGuide.html#_vt6
desktophttps://learning-python.com/thumbspage/examples/2.0-upgrades/javascript-desktop-viewpage-off.png
mobilehttps://learning-python.com/thumbspage/examples/2.0-upgrades/javascript-mobile-viewpage-off.jpg
experiencehttps://learning-python.com/thumbspage/examples/2.0-upgrades/javascript-desktop-viewpage-on.png
pageshttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d2-thin.png
notehttps://learning-python.com/thumbspage/UserGuide.html#tooltips23
4 incheshttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-mobile-ios4inch.PNG
windowhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hide-toolbars.PNG
betterhttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-no-ios13-hidetoolbar.jpeg
earlier, the Full button on thumbspage viewer pages is optional, because it lasts for just one page, and is supported unevenly across browsers. By contrast, many browsers offer a manual, user-initiated fullscreen mode that persists across page switches, including those of thumbspage Auto slideshows. Where available, this can be a much more useful alternative. The options for invoking a manual fullscreen are too many to cover here, but here's a quick rundown: On Windows, the F11 key (with fn if needed) puts the browser in fullscreen mode, which persists for all pages visited until explicitly disabled with another F11. This works in Chrome, Firefox, Edge, Internet Explorer, and likely others, and allows thumbspage Auto slideshows to run completely in fullscreen mode. On Linux, the F11 key (with fn if needed) switches browsers to and from persistent fullscreen mode, just as it does on Windows. This works in Chromium, Firefox, and likely others, and, as on Windows, allows thumbspage Auto slideshows to run completely in fullscreen mode. On macOS, you can toggle a similar persistent fullscreen mode in Chrome, Safari, and Firefox, with the keys combination control+command+f. A shift+command+f may additionally hide the toolbar in Chrome (but not Firefox, currently), and you can also go fullscreen by clicking the upper-left-corner green button or using menu fullscreen icons. On iOS 13, Safari's Hide Toolbar option of the preceding note isn't fully fullscreen, but it's close enough to mention again here, and lasts for all pages you visit (including those in Auto slideshows). This alone makes it worth upgrading to iOS 13, if you already haven't. On Android, numerous apps available from the Play Store promise persistent fullscreen support. Judging from chatter on the web, though, some may be better than others, so the usual due-diligence caution applies. It may also be possible to force a browser app to use Android fullscreen mode with a tethered ADB command or Settings option, but this may not omit the browser's own UI baggage, and ADB seems well beyond most users' patience. See also the Opera update ahead for a new Android fullscreen option. For additional tips and other platforms and browsers, try a web search, or consult your browser; browsers change regularly, and new fullscreen options may crop up over time. Manual and persistent fullscreen isn't available everywhere today, but it generally beats thumbspage's one-page Full where possible. You may still find thumbspage's Full useful as a quick zoom, though, especially on browsers that lack a manual option today. With any luck, those browsers will make Full fully superfluous in the not-too-distant tomorrow. Update: on Android, the Opera web browser recently gained an amazing fullscreen mode for landscape that works much like those in desktop browsers, and spans multiple pages. For details, see this usage note at thumbspage's host site. The Opera browser is largely the same as Chrome under the hood, and runs thumbspage galleries just as well—and arguably better with its landscape fullscreen. Yet another reason to consider parting with the herd on Android. (Defunct) iOS Chrome may stack navigation history thumbspage image-viewer pages are not normally stacked (i.e., remembered) in browser history as you—or a slideshow you started—navigate through galleries. This by design, because it makes browser Back operations return to the viewer pages' entry point immediately, instead of stepping back though each image viewed. This may not work in some versions of Chrome on iOS, unfortunately, due to a bug in that browser. That bug appears to have been fixed in Chrome 83 (or earlier), but was known to still be broken as of Chrome 75. If your Chrome stacks pages, either retrace pages as needed for that browser's Back, or use any other iOS browser to view thumbspage galleries. Viewing galleries offline on PCs thumbspage bills its galleries as viewable both online (at a website) and offline (on your device). In more detail, online mode works universally on all devices, and offline is trivial on PCs (which means Windows, Linux, and macOS here)—a click in a file-explorer window (e.g., Finder or Explorer) normally suffices to open a gallery in your default browser, and right-clicks, browser Open functions, and explicit file:// URLs offer more options. On mobile devices, however, offline viewing isn't always as seamless, but you'll have to move on to the next two notes for the Android and iOS offline stories. macOS Safari users: see also the caveat ahead for the rare use case of browser Back returns to offline galleries. Viewing galleries offline on Android (TL;DR: jump to the latest update for new file-explorer options.) On some unrooted Androids, you may have trouble viewing a gallery stored locally on the device: the index page may open in a file explorer, but its thumbnails and viewer pages won't. This happens mostly in Chrome on newer Androids, and seems related to that platform's push to tighter permissions and content:// URIs. While these may be spun as security measures, that argument has been tiredly used for many an Android breakage. thumbspage galleries are known to work offline on Androids Nougat, Oreo, Pie, and 10, but its releases and devices vary too widely to give universal advice here. If your offline gallery fails, try the following work-arounds that have proved successful in some contexts: Move it to internal storage instead of SD card (e.g., on Pie and earlier) View it with a different browser (e.g., Firefox, Opera or Samsung instead of Chrome) Open it with a different file explorer (e.g., Total Commander, and tap file://url if present) Open it via a manually typed file URL (e.g., file:///sdcard/...) Ditto, but try different pathnames in the URL (e.g., /storage/emulated/0; see the primer) Move it online if possible, and open with a web URL (e.g., https://...) Especially on newer Androids, also make sure the browser has permission to access your files in storage. Firefox, for example, may require this on Android 10. Try Settings/Apps and navigate to storage permissions, or similar on your device. This has grown more crucial as later Androids have moved to lock down storage to app-specific sandboxes. If you're technically inclined, you might also try running a web-server app on your device and viewing your gallery on localhost or a dedicated port number; this is wholly untested (but arguably awesome). Caveat: the upcoming Android 11 will clamp permissions down further (read the latest edicts here), but its impact on browser apps remains to be seen. Update: for recent findings on both local-file views and running web-server apps on Android, see the off-page coverage here, which is part of an Android 11 review. In short, you can run a web server on Android, but your functionality may be limited and your disconnections many. Android 11 has also narrowed your options for local-file views in browsers, in the name of a security rationale; inoperable phones may be secure, but they're also inoperable. Update: the thumbspage team recently discovered another route to offline viewing on Android. On Android 11, simply copy your content into the browser's own sandboxed folder, using a file explorer that has permission to do so (Solid Explorer and Cx File Explorer do at this writing). Then, use that folder's local path in a file:// URL in the browser to view offline. For example, copy content to these locations for Chrome and Opera (alas, this won't work for Firefox on 11, because it strips the file://): file:///storage/emulated/0/Android/data/com.android.chrome/your-folder-and-file-here file:///storage/emulated/0/Android/data/com.opera.browser/your-folder-and-file-here This works for Chrome on Android 10 too, but isn't required for Opera or Firefox on 10, where they have full access to arbitrary storage paths (unlike both Chrome on 10, and all browsers on 11). This isn't the same as arbitrary file access, of course; you're limited to files dropped into a browser's folder. This is also an arguably terrible idea: your content in the sandbox folder will be deleted if you uninstall the browser, and is prone to being nuked if the browser ever resets its own folder. Hacker beware! Update: in late 2021, some Android file explorers now provide seemingly heroic work-arounds on Android 11 that allow you to use a browser to view web pages stored locally on your phone—including thumbspage galleries. For example, among file-explorer apps tested: Cx now automatically spawns an HTTP server to open local HTML files, and launches your browser to view these files on the locally running server. This is not a full Apache web server (e.g., URL rewrites and auto-indexes won't work, and CGI scripts are displayed instead of run), and local folder listings are explicitly disabled by the server. Still, this works well for basic views of much client-side content, including galleries generated by thumbspage. Solid, among others, now opens local HTML files in browsers with suitable content:// URIs that implement Android's content-provider paradigm. This scheme is not a substitute for a web server, opens some complex pages slowly, and can break down for some nested website content (e.g., folder indexes may oddly invoke a download that fails). But it also suffices for viewing basic content and thumbspage galleries on your phone. Thus, your first step when trying to view locally stored thumbspage galleries on Android 11 and later today is to simply try opening them in a file-explorer app to see if they are supported automatically. For more details on the constantly evolving struggle between Android permissions and file explorers, see also the updates here, here, and here. Viewing galleries offline on iOS? On unrooted Apple mobiles, iOS 13's enhanced Files app allows you to open files both on USB drives and copied to internal storage. This lets you view a gallery's pages, but doesn't open a browser. Instead, it runs a stripped-down quick-view that lacks JavaScript and shows just the top-level page's text, not any images it embeds. The net effect is much like recent Android Chromes of the preceding note, and your most direct recourse may be an online (or local network) upload. While there may be additional iOS options beyond thumbspage's testing budget, Apple has historically been more closed than Android (and its appetite for control seems only to be growing). Beware browser settings and bugs Some browser settings that may appear harmless can adversely impact thumbspage galleries. The native (a.k.a. raw) image display of some versions of Android Chrome, for example, may initially render some images weirdly large in portrait orientation, but if and only if the seemingly unrelated Force enable zoom is selected in Accessibility Settings. The image-tap raw displays of thumbspage viewer pages trigger this effect, but do not cause it—it also happens when visiting images' URLs directly, outside gallery pages. There's more on this issue in search results, while they last; its impact is broad, but likely to be reversed soon. Nor is this an isolated case. As another example, the thumbspage team recently found and reported a settings-related bug in 2020's Android Firefox—though not thumbspage specific, this browser sometimes leaves an odd blank strip at the bottom of thumbspage viewer pages if you enable its "Scroll to hide toolbar" option (more details here). Thumbspage's host site also reported a bug in version 53 of Android Opera—though it does not impact thumbspage galleries (and was fixed in version 60), this browser strangely truncated the remainder of a page at a /* character sequence in text formatted with
.



At the end of the day, thumbspage is completely dependent on browsers which
change frequently and arbitrarily, and have an unfortunate history of 
fragility (indeed, at times it seems a website could be laid low by a good
sneeze).  For best results, clear settings that cause issues on Android, 
use similarly obscure browser behavioral switches with care, and try 
other browsers as a last resort when browser bugs—and enhancements—break
your viewing experience.
https://learning-python.com/thumbspage/UserGuide.html#fullscreenbutton
notehttps://learning-python.com/thumbspage/UserGuide.html#_vt3
patiencehttps://duckduckgo.com/?q=force+android+app+into+fullscreen
usage notehttps://learning-python.com/about-this-site.html#androidbrowsernews_opera
hoodhttps://en.wikipedia.org/wiki/Browser_engine
wellhttps://en.wikipedia.org/wiki/Chromium_(web_browser)
aheadhttps://learning-python.com/thumbspage/UserGuide.html#moresafarijunk
updatehttps://learning-python.com/thumbspage/UserGuide.html#androidbrowserlocalviews
permissionshttps://duckduckgo.com/?q=android+scope+storage
URIshttps://duckduckgo.com/?q=android+content+uri+required
breakagehttps://learning-python.com/mergeall-android-scripts/_README.html#thefutureisclosed
primerhttps://learning-python.com/mergeall-android-scripts/_README.html#toc7
sandboxeshttps://learning-python.com/mergeall-android-scripts/_README.html#toc9
web-server apphttps://duckduckgo.com/?q=android+web+server+app
herehttps://developer.android.com/preview/privacy/storage
herehttps://learning-python.com/mergeall-android11-updates.html#asb6
herehttps://learning-python.com/mergeall-android11-updates.html#morefileexplorersupdate
herehttps://learning-python.com/android-deltas-sync/_README.html#Android%20File%20Explorers
herehttps://learning-python.com/pydroid3-loses-storage-access.html#s43
growinghttps://duckduckgo.com/?q=apple+mac+os+dropping+intel+chips
searchhttps://duckduckgo.com/?q=android+chrome+force+enable+zoom+displays+images+too+large
herehttps://learning-python.com/about-this-site.html#androidbrowsernews
viewers' sectionhttps://learning-python.com/thumbspage/UserGuide.html#Viewing Galleries
herehttp://learning-python.com/site-mobile-screenshots/index.html
herehttps://learning-python.com/thumbspage/examples/reorientation/index.html
defaultshttps://learning-python.com/thumbspage/examples/subfolders/index.html
earlierhttps://learning-python.com/thumbspage/UserGuide.html#Viewing Galleries
learning-python.com/thumbspage.htmlhttps://learning-python.com/thumbspage.html#Download
www.python.org/downloads/https://www.python.org/downloads/
pypi.python.org/pypi/Pillowhttps://pypi.python.org/pypi/Pillow
this pagehttp://learning-python.com/tagpix/README-macapp.html
aheadhttps://learning-python.com/thumbspage/UserGuide.html#rotateskeepexifs
piexifhttps://pypi.org/project/piexif/
itselfhttps://learning-python.com/thumbspage/piexif
Termuxhttps://termux.com/
searchhttps://duckduckgo.com/?q=python+pillow+in+termux
herehttps://pillow.readthedocs.io/en/stable/installation.html#building-on-android
Pydroid 3https://play.google.com/store/apps/details?id=ru.iiec.pydroid3
herehttps://learning-python.com/thumbspage/examples/1.7-upgrades/build-on-android-1.jpg
herehttps://learning-python.com/thumbspage/examples/1.7-upgrades/build-on-android-2.jpg
herehttps://learning-python.com/thumbspage/examples/1.7-upgrades/built-on-android-index.jpg
herehttps://learning-python.com/thumbspage/examples/console-logs/android.txt
this dochttps://learning-python.com/mergeall-android-scripts/_README.html#toc9
Pythonistahttps://apps.apple.com/us/app/pythonista-3/id1085978097
tighterhttps://learning-python.com/post-release-updates.html#mergeallandroid
sectionhttps://learning-python.com/thumbspage/UserGuide.html#Installs and Platforms
thumbspage.pyhttps://learning-python.com/thumbspage/thumbspage.py
PyEdithttp://learning-python.com/pyedit.html
IDLEhttps://docs.python.org/3/library/idle.html
sectionhttps://learning-python.com/thumbspage/UserGuide.html#otherusagemodes
aheadhttps://learning-python.com/thumbspage/UserGuide.html#pathprimer
aheadhttps://learning-python.com/thumbspage/UserGuide.html#Building Tips
folderhttps://learning-python.com/thumbspage/UserGuide.html#other21
aheadhttps://learning-python.com/thumbspage/UserGuide.html#Customization
alternativehttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
sectionhttps://learning-python.com/thumbspage/UserGuide.html#thumbsizeinputs
updatehttps://learning-python.com/thumbspage/UserGuide.html#thumbsize23
aheadhttps://learning-python.com/thumbspage/UserGuide.html#Building Tips
console loghttps://learning-python.com/thumbspage/examples/console-logs/2.0-console-errors.txt
folderhttps://learning-python.com/thumbspage/examples/console-logs/
herehttps://learning-python.com/thumbspage/UserGuide.html#inputs23
herehttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
streamhttps://en.wikipedia.org/wiki/Standard_streams
open bughttps://bugs.python.org/issue25692
tagpixhttps://learning-python.com/tagpix.html
herehttps://learning-python.com/thumbspage/examples/2.0-upgrades/_generate.sh
herehttps://learning-python.com/thumbspage/examples/dynamiclayout/_generate.sh
herehttps://learning-python.com/thumbspage/build/generate-examples.py
herehttps://learning-python.com/thumbspage/build/
abovehttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
streamshttps://en.wikipedia.org/wiki/Standard_streams
redirectionhttps://en.wikipedia.org/wiki/Redirection_(computing)
variableshttps://duckduckgo.com/?q=shell+variables
here docshttps://duckduckgo.com/?q=here+documents
exampleshttps://learning-python.com/thumbspage/examples/
Customizationhttps://learning-python.com/thumbspage/UserGuide.html#Customization
Building Tipshttps://learning-python.com/thumbspage/UserGuide.html#Building Tips
argumenthttps://learning-python.com/thumbspage/UserGuide.html#_177
reportinghttps://learning-python.com/thumbspage/UserGuide.html#_20B
layouthttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
foldershttps://learning-python.com/thumbspage/UserGuide.html#other21
filehttps://learning-python.com/thumbspage/UserGuide.html#Customization
release notehttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
notehttps://learning-python.com/thumbspage/UserGuide.html#inputs23
exampleshttps://learning-python.com/thumbspage/UserGuide.html#inputconfigexamples
notehttps://learning-python.com/thumbspage/UserGuide.html#thumbsize23
prompthttps://learning-python.com/thumbspage/UserGuide.html#promptsandreplies
PyEdithttp://learning-python.com/pyedit.html
prompthttps://learning-python.com/thumbspage/UserGuide.html#promptsandreplies
Pillowhttps://learning-python.com/thumbspage/UserGuide.html#Installs and Platforms
this scripthttps://learning-python.com/thumbspage/docetc/pillow-thumb-size-scaling.py
updatehttps://learning-python.com/thumbspage/UserGuide.html#thumbsize23
sectionhttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
imageshttps://learning-python.com/thumbspage/UserGuide.html#rotation
laterhttps://learning-python.com/thumbspage/UserGuide.html#Version History
filehttps://learning-python.com/thumbspage/user_configs.py
release notehttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
examples/https://learning-python.com/thumbspage/examples/
this examplehttps://learning-python.com/thumbspage/examples/reorientation/index.html
this demohttps://learning-python.com/site-mobile-screenshots/index.html
narrativeshttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-other-subfolders.png
Tophttps://learning-python.com/thumbspage/UserGuide.html#_202
subfoldershttps://learning-python.com/thumbspage/UserGuide.html#1.1
filehttps://learning-python.com/thumbspage/user_configs.py
aheadhttps://learning-python.com/thumbspage/UserGuide.html#1.3
linkshttps://learning-python.com/trnpix/index-dynamic.html
texthttps://learning-python.com/thumbspage/examples/unicode/images/index.html
aheadhttps://learning-python.com/thumbspage/UserGuide.html#floatingtop20
alternativehttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
herehttp://learning-python.com/site-mobile-screenshots/
this notehttps://learning-python.com/thumbspage/UserGuide.html#_206
this scripthttps://learning-python.com/thumbspage/build/insert-analytics.py
template-viewpage.htmlhttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
herehttps://learning-python.com/thumbspage/UserGuide.html#_206
template-floatingtop.htmlhttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-floatingtop.html
notehttps://learning-python.com/thumbspage/UserGuide.html#floatingtop20
popuphttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d1-large.png
buttonhttps://learning-python.com/thumbspage/examples/2.3-upgrades/btns-d4-all-on.png
displayshttps://learning-python.com/thumbspage/UserGuide.html#viewerswipes
galleryhttps://learning-python.com/trnpix/index-dynamic.html
notehttps://learning-python.com/thumbspage/UserGuide.html#notes23
pageshttps://learning-python.com/thumbspage/UserGuide.html#omitlabels23
herehttps://learning-python.com/cgi/showcode.py?name=trnpix/index-dynamic.html
herehttps://learning-python.com/cgi/showcode.py?name=trnpix/_thumbspage/2010 Sarasota 1.JPG.html
herehttps://learning-python.com/trnpix/_thumbspage-dynamic/
herehttps://learning-python.com/trnpix/index-dynamic.html
3.0https://learning-python.com/thumbspage/UserGuide.html#3.0
Quick Starthttps://learning-python.com/thumbspage/UserGuide.html#configfiles30
release noteshttps://learning-python.com/thumbspage/UserGuide.html#3.0
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
Version Historyhttps://learning-python.com/thumbspage/UserGuide.html#Version History
Viewer pages (or not)https://learning-python.com/thumbspage/UserGuide.html#_un1
Image filenames text and lengthhttps://learning-python.com/thumbspage/UserGuide.html#_un2
Supported image typeshttps://learning-python.com/thumbspage/UserGuide.html#_un3
Other image-folder contenthttps://learning-python.com/thumbspage/UserGuide.html#_un4
Subfolder bullet listshttps://learning-python.com/thumbspage/UserGuide.html#_un5
Linking to results with URLshttps://learning-python.com/thumbspage/UserGuide.html#_un6
Tilted-image rotationhttps://learning-python.com/thumbspage/UserGuide.html#_un7
Cleaning the thumbs folderhttps://learning-python.com/thumbspage/UserGuide.html#_un8
Thumbs-folder namehttps://learning-python.com/thumbspage/UserGuide.html#_un9
Extra-files overheadhttps://learning-python.com/thumbspage/UserGuide.html#_unA
A word on image size and speedhttps://learning-python.com/thumbspage/UserGuide.html#_unC
Running thumbspagehttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
pageshttps://learning-python.com/thumbspage/examples/reorientation/_thumbspage/galaxys8-6R.jpg.html
release noteshttps://learning-python.com/thumbspage/UserGuide.html#1.7
noteshttps://learning-python.com/thumbspage/UserGuide.html#2.0
notehttps://learning-python.com/thumbspage/UserGuide.html#_204
typehttps://en.wikipedia.org/wiki/Media_type
extensionhttps://en.wikipedia.org/wiki/Filename_extension
formathttps://en.wikipedia.org/wiki/WebP
Safarihttps://en.wikipedia.org/wiki/WebP#Support
this shothttps://learning-python.com/thumbspage/examples/mixedtypes/About-this-folder/chrome-firefox-safari-2020.png
examples/mixedtypeshttps://learning-python.com/thumbspage/examples/mixedtypes/index.html
this pagehttps://en.wikipedia.org/wiki/Comparison_of_web_browsers#Image_format_support
this searchhttps://duckduckgo.com/?q=display+tiff+in+web+browser
popupshttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-camera-brand1-ff.png
solutionshttps://duckduckgo.com/?q=pythin+pillow+heic
herehttps://duckduckgo.com/?q=convert+heif+to+jpeg
herehttps://duckduckgo.com/?q=iphone+share+images+as+jpeg+instead+of+heic
2.3 coveragehttps://learning-python.com/thumbspage/UserGuide.html#notes23
specialhttps://learning-python.com/thumbspage/UserGuide.html#Customization
subfolder-linkshttps://learning-python.com/thumbspage/examples/Screenshots/subfolders-1.png
filehttps://learning-python.com/thumbspage/user_configs.py
folderhttps://learning-python.com/thumbspage/examples/mixedtypes/index.html
foldershttps://learning-python.com/thumbspage/examples/subfolders/index.html
filehttps://learning-python.com/thumbspage/UserGuide.html#Customization
aheadhttps://learning-python.com/thumbspage/UserGuide.html#1.1
toohttps://learning-python.com/thumbspage/UserGuide.html#_178
itemshttps://learning-python.com/thumbspage/UserGuide.html#other21
tiltedhttps://learning-python.com/thumbspage/examples/Screenshots/reorient-prior-index.png
imagehttps://learning-python.com/thumbspage/examples/Screenshots/reorient-new-viewer.png
thumbnailhttps://learning-python.com/thumbspage/examples/Screenshots/reorient-new-index.png
tagshttps://en.wikipedia.org/wiki/Exif
standardhttps://www.exif.org/Exif2-2.PDF
imagehttps://learning-python.com/thumbspage/UserGuide.html#rotateskeepexifs
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
utility scripthttps://learning-python.com/thumbspage/docetc/restore-prerotate-originals.py
Version Historyhttps://learning-python.com/thumbspage/UserGuide.html#rotation16
Running thumbspagehttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
learning-python.comhttp://learning-python.com/programs.html
Mergeallhttp://learning-python.com/mergeall.html
contextshttps://en.wikipedia.org/wiki/Bandwidth_throttling
Pillowhttps://python-pillow.org/
dimensionshttps://duckduckgo.com/?q=python+pillow+image+scale+down
qualityhttps://duckduckgo.com/?q=python+pillow+image+reduce+file+size
shrinkpixhttp://learning-python.com/shrinkpix.html
full packagehttp://learning-python.com/thumbspage.html#Download
shrinkpixhttp://learning-python.com/shrinkpix.html
update notehttps://learning-python.com/thumbspage/UserGuide.html#thumbnails17
shrinkpix docshttp://learning-python.com/shrinkpix/shrinkpix.py
serverhttp://learning-python.com/about-this-site.html#vpssiterelo
mod_pagespeedhttps://www.modpagespeed.com/
bookhttp://learning-python.com/about-pp4e.html
apphttps://learning-python.com/using-tkinter-programs-on-android.html
GUIhttps://learning-python.com/thumbspage/examples/Screenshots/x-viewer_thumbs-gui-mode.png
as muchhttps://learning-python.com/thumbspage/examples/Screenshots/x-viewer_thumbs-links-popup.png
herehttps://learning-python.com/thumbspage/examples/Screenshots/y-pyphoto-1.png
herehttps://learning-python.com/thumbspage/examples/Screenshots/y-pyphoto-3.png
http://learning-python.com/pygadgets.htmlhttp://learning-python.com/pygadgets.html
sizehttps://learning-python.com/thumbspage/UserGuide.html#packages21
web pagehttp://learning-python.com/thumbspage.html#Download
filehttps://learning-python.com/thumbspage/user_configs.py
herehttps://learning-python.com/thumbspage/UserGuide.html#1.1
addshttps://learning-python.com/thumbspage/UserGuide.html#subfolderslayout
rotateshttps://learning-python.com/thumbspage/UserGuide.html#rotation16
thumbnailshttps://learning-python.com/thumbspage/UserGuide.html#21rotations
restore-prerotate-originals.pyhttps://learning-python.com/thumbspage/docetc/restore-prerotate-originals.py
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
code fileshttps://learning-python.com/thumbspage/
3.0.1: Android Chrome Fix (2025)https://learning-python.com/thumbspage/UserGuide.html#3.0.1
3.0: Tags, Keys, Swipes (2025)https://learning-python.com/thumbspage/UserGuide.html#3.0
2.3: Notes, Inputs (2022+)https://learning-python.com/thumbspage/UserGuide.html#2.3
2.2: Swipes, Configs (2021)https://learning-python.com/thumbspage/UserGuide.html#2.2
2.1: Thumbs, Layout (2021)https://learning-python.com/thumbspage/UserGuide.html#2.1
2.0: Auto, Top, Full (2020)https://learning-python.com/thumbspage/UserGuide.html#2.0
1.7: Info, Exifs, Etc. (2020)https://learning-python.com/thumbspage/UserGuide.html#1.7
1.6: Scaling, Rotation (2018)https://learning-python.com/thumbspage/UserGuide.html#1.6
1.5: Viewer Pages (2018)https://learning-python.com/thumbspage/UserGuide.html#1.5
1.4: Mobile (2018)https://learning-python.com/thumbspage/UserGuide.html#1.4
1.3: Unicode (2016)https://learning-python.com/thumbspage/UserGuide.html#1.3
1.2: Styling (2016)https://learning-python.com/thumbspage/UserGuide.html#1.2
1.1: Subfolders (2016)https://learning-python.com/thumbspage/UserGuide.html#1.1
1.0: The Basics (2016)https://learning-python.com/thumbspage/UserGuide.html#1.0
pageshttps://learning-python.com/trnpix/_thumbspage-dynamic/2023%20Sync%20App.jpg.html
infohttps://learning-python.com/thumbspage/examples/3.0-screenshots/_thumbspage/viewer-info.png.html
filehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
docshttps://developer.chrome.com/blog/overscroll-behavior/#disabling_pull-to-refresh
statcounterhttps://gs.statcounter.com/browser-market-share/mobile/worldwide
statistahttps://www.statista.com/statistics/263517/market-share-held-by-mobile-internet-browsers-worldwide/
sitehttps://learning-python.com
live demohttps://learning-python.com/thumbspage/examples/3.0-upgrades/index.html
screenshotshttps://learning-python.com/thumbspage/examples/3.0-screenshots/index.html
use casehttps://learning-python.com/trnpix/index-dynamic.html
Omitted filename extensionshttps://learning-python.com/thumbspage/UserGuide.html#30.1
Gallery wraparound messageshttps://learning-python.com/thumbspage/UserGuide.html#30.2
Automatic end-of-gallery imageshttps://learning-python.com/thumbspage/UserGuide.html#30.3
Raw-view messages on image tapshttps://learning-python.com/thumbspage/UserGuide.html#30.4
HTML tags and entities in noteshttps://learning-python.com/thumbspage/UserGuide.html#30.5
Explicit ordering with ORDER.txthttps://learning-python.com/thumbspage/UserGuide.html#30.6
Alternative labels with CAPTIONS.pyhttps://learning-python.com/thumbspage/UserGuide.html#30.7
Alternative notes with NOTES.pyhttps://learning-python.com/thumbspage/UserGuide.html#30.8
Per-host or forced dark color themehttps://learning-python.com/thumbspage/UserGuide.html#30.9
Configurable line spacing for texthttps://learning-python.com/thumbspage/UserGuide.html#30.10
Image filenames in info popupshttps://learning-python.com/thumbspage/UserGuide.html#30.11
Swipes on touchpads and mice toohttps://learning-python.com/thumbspage/UserGuide.html#30.12
Keypress shortcuts in viewer pageshttps://learning-python.com/thumbspage/UserGuide.html#30.13
Error checks for build filenameshttps://learning-python.com/thumbspage/UserGuide.html#30.14
Preset defaults and links colorhttps://learning-python.com/thumbspage/UserGuide.html#30.15
configshttps://learning-python.com/thumbspage/user_configs.py
buildshttps://learning-python.com/thumbspage/examples/3.0-upgrades/_generate.sh
confighttps://learning-python.com/thumbspage/UserGuide.html#30.15
counterparthttps://learning-python.com/thumbspage/UserGuide.html#30.9
demohttps://learning-python.com/thumbspage/examples/3.0-upgrades/_viewable/
demohttps://learning-python.com/thumbspage/examples/3.0-upgrades/_viewable/
abovehttps://learning-python.com/thumbspage/UserGuide.html#fnlimits
demohttps://learning-python.com/thumbspage/examples/3.0-upgrades/_viewable/
demohttps://learning-python.com/thumbspage/examples/3.0-upgrades/_viewable/
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
belowhttps://learning-python.com/thumbspage/UserGuide.html#30presets
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
omittedhttps://learning-python.com/thumbspage/UserGuide.html#fnomit30
captionshttps://learning-python.com/thumbspage/UserGuide.html#captions30
herehttps://learning-python.com/thumbspage/examples/3.0-screenshots/_thumbspage/viewer-info.png.html
abovehttps://learning-python.com/thumbspage/UserGuide.html#30.9
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
image noteshttps://learning-python.com/thumbspage/UserGuide.html#notes23
overrideshttps://learning-python.com/thumbspage/UserGuide.html#inputs23
tooltipshttps://learning-python.com/thumbspage/UserGuide.html#tooltips23
changeshttps://learning-python.com/thumbspage/UserGuide.html#other23
folderhttps://learning-python.com/thumbspage/examples/2.3-upgrades/index.html
colorshttps://learning-python.com/thumbspage/UserGuide.html#popupcolors23
opacityhttps://learning-python.com/thumbspage/UserGuide.html#popupopacity23
layouthttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout23
labelshttps://learning-python.com/thumbspage/UserGuide.html#omitlabels23
bugletshttps://learning-python.com/thumbspage/UserGuide.html#buglets23
enhancementhttps://learning-python.com/thumbspage/UserGuide.html#thumbsize23
popupshttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d1-large.png
buttonshttps://learning-python.com/thumbspage/examples/2.3-upgrades/btns-d4-all-on.png
examplehttps://learning-python.com/thumbspage/examples/2.3-upgrades/index.html
galleryhttps://learning-python.com/trnpix/index-dynamic.html
herehttps://learning-python.com/thumbspage/UserGuide.html#notebutton
herehttps://learning-python.com/thumbspage/UserGuide.html#viewerswipes
sectionhttps://learning-python.com/thumbspage/UserGuide.html#notefiles
filehttps://learning-python.com/thumbspage/user_configs.py
3.0https://learning-python.com/thumbspage/UserGuide.html#3.0
settinghttps://learning-python.com/thumbspage/user_configs.py
fileshttps://learning-python.com/thumbspage/UserGuide.html#Customization
demohttps://learning-python.com/cgi/showcode.py?name=thumbspage/examples/2.3-upgrades/x-nojavascript1-2.3.png.note
line-throughhttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-x1-none.png
texthttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-x2-none.png
fileshttps://learning-python.com/thumbspage/examples/2.3-upgrades/btns-d3-full-only.png
emojishttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-x4-long-unicode.png
herehttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/z-escaped-note-text.png.html
3.0https://learning-python.com/thumbspage/UserGuide.html#3.0
settinghttps://learning-python.com/thumbspage/user_configs.py
settinghttps://learning-python.com/thumbspage/user_configs.py
aheadhttps://learning-python.com/thumbspage/UserGuide.html#omitlabels23
batchnotes.pyhttps://learning-python.com/thumbspage/docetc/batchnotes.py
examplehttps://learning-python.com/thumbspage/examples/2.3-upgrades/_batchnotes.txt
demohttps://learning-python.com/trnpix/_batchnotes.txt
infohttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d4-info-on-top.png
Notehttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d1-large.png
filehttps://learning-python.com/thumbspage/user_configs.py
equivalentshttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
infohttps://learning-python.com/thumbspage/UserGuide.html#_20A
herehttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/y-pcolors-1-prior-wb.png.html
galleryhttps://learning-python.com/trnpix/index-dynamic.html
generatehttps://learning-python.com/trnpix/_generate.sh
publishhttps://learning-python.com/trnpix/_publish.sh
version 2.2https://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
filehttps://learning-python.com/thumbspage/user_configs.py
1.7https://learning-python.com/thumbspage/UserGuide.html#_177
2.1https://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
2.2https://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
earlierhttps://learning-python.com/thumbspage/UserGuide.html#otherusagemodes
platformshttps://duckduckgo.com/?q=windows+line+coninuation
tooltipshttps://learning-python.com/thumbspage/examples/2.3-upgrades/tooltips5.png
buttonshttps://learning-python.com/thumbspage/examples/2.3-upgrades/tooltips2.png
messagehttps://learning-python.com/thumbspage/examples/2.3-upgrades/x-nojavascript1-2.3.png
stylehttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d4-info-on-top.png
suithttps://learning-python.com/thumbspage/examples/2.3-upgrades/note-d3-short.png
toohttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/y-pcolors-2-preset-wb.png.html
abovehttps://learning-python.com/thumbspage/UserGuide.html#popupcolors23
filehttps://learning-python.com/thumbspage/user_configs.py
argumenthttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
herehttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/yy-opacity1-image.png.html
argumentshttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
overrideshttps://learning-python.com/thumbspage/UserGuide.html#inputs23
howhttps://learning-python.com/thumbspage/examples/dynamiclayout/_generate.sh
doeshttps://learning-python.com/thumbspage/examples/2.3-upgrades/_generate.sh
generatehttps://learning-python.com/trnpix/_generate.sh
publishhttps://learning-python.com/trnpix/_publish.sh
filehttps://learning-python.com/thumbspage/user_configs.py
equivalenthttps://learning-python.com/thumbspage/UserGuide.html#inputs23
casehttps://learning-python.com/thumbspage/UserGuide.html#thumbsizereply
2.1https://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
notehttps://learning-python.com/thumbspage/UserGuide.html#omitlabels23
columnhttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/xx-mobile-dyn.png.html
thumbspage.pyhttps://learning-python.com/thumbspage/thumbspage.py
herehttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/xx-desktop-dyn.png.html
filehttps://learning-python.com/thumbspage/user_configs.py
examplehttps://learning-python.com/trnpix/_generate.sh
demohttps://learning-python.com/trnpix/index.html
flavorhttps://learning-python.com/trnpix/index-dynamic.html
pageshttps://learning-python.com/thumbspage/examples/2.3-upgrades/xx-desktop-dyn.png
herehttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/xx-omit-index-labels-dyn.png.html
demohttps://learning-python.com/trnpix/index-thumbsonly.html
docshttps://learning-python.com/thumbspage/user_configs.py
pageshttps://learning-python.com/thumbspage/examples/2.3-upgrades/btns-d4-all-on.png
mobilehttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/xx-omit-labels-mobile-i.png.html
noteshttps://learning-python.com/thumbspage/UserGuide.html#notes23
examplehttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/y-pcolors-5-ccc-18.png.html
demohttps://learning-python.com/thumbspage/examples/2.3-upgrades/_thumbspage/z-escaped-note-text.png.html
galleryhttps://learning-python.com/trnpix/index.html
dynamic layouthttps://learning-python.com/trnpix/index-dynamic.html
namehttps://learning-python.com/thumbspage/examples/reorientation/_thumbspage/galaxys8-1N.jpg.html
version 3.0https://learning-python.com/thumbspage/UserGuide.html#3.0
swipe gestureshttps://learning-python.com/thumbspage/UserGuide.html#swipegestures22
config argumentshttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
tooltipshttps://learning-python.com/thumbspage/UserGuide.html#tooltips22
changeshttps://learning-python.com/thumbspage/UserGuide.html#other22
folderhttps://learning-python.com/thumbspage/examples/2.2-upgrades/index.html
sectionhttps://learning-python.com/thumbspage/UserGuide.html#viewerswipes
sectionhttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
templatehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
herehttps://learning-python.com/thumbspage.html#demos
notehttps://learning-python.com/thumbspage/UserGuide.html#notes23
noteshttps://learning-python.com/thumbspage/UserGuide.html#3.0
messagehttps://learning-python.com/thumbspage/examples/2.2-upgrades/misc-gallery/up-swipe-fail-chrome.jpg
codehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
messagehttps://learning-python.com/thumbspage/examples/2.2-upgrades/misc-gallery/up-swipe-message-samsung.jpg
filehttps://learning-python.com/thumbspage/user_configs.py
filehttps://learning-python.com/thumbspage/user_configs.py
filehttps://learning-python.com/thumbspage/user_configs.py
differhttps://duckduckgo.com/?q=windows+command+line+escapes
subsystemhttps://duckduckgo.com/?q=windows+linux+subsystem
examplehttps://learning-python.com/thumbspage/examples/dynamiclayout/_generate.sh
layouthttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
tooltipshttps://learning-python.com/thumbspage/UserGuide.html#tooltips22
themehttps://learning-python.com/thumbspage/UserGuide.html#indexcolor22
swipeshttps://learning-python.com/thumbspage/UserGuide.html#swipegestures22
toolshttps://duckduckgo.com/?q=windows+line+coninuation
usualhttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
filehttps://learning-python.com/thumbspage/user_configs.py
usagehttps://learning-python.com/android-deltas-sync/_etc/screenshots/index.html
herehttps://learning-python.com/thumbspage/examples/2.2-upgrades/more-demos/config-args-demo.sh
notehttps://learning-python.com/thumbspage/UserGuide.html#inputs23
exampleshttps://learning-python.com/thumbspage/UserGuide.html#inputconfigexamples
filehttps://learning-python.com/thumbspage/user_configs.py
argumentshttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
nonstartershttps://learning-python.com/thumbspage/UserGuide.html#moresafarijunk
herehttps://learning-python.com/thumbspage/examples/2.2-upgrades/tooltips-gallery/index.html
notehttps://learning-python.com/thumbspage/UserGuide.html#tooltips23
popuphttps://learning-python.com/thumbspage/UserGuide.html#_20A
earlierhttps://learning-python.com/thumbspage/UserGuide.html#tooltips22
configshttps://learning-python.com/thumbspage/UserGuide.html#Customization
abovehttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
examplehttps://learning-python.com/thumbspage/examples/2.2-upgrades/misc-gallery/index.html
truehttps://learning-python.com/thumbspage/examples/2.2-upgrades/tooltips-gallery/index.html
layouthttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
confighttps://learning-python.com/thumbspage/user_configs.py
tableshttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
confighttps://learning-python.com/thumbspage/user_configs.py
2.1https://learning-python.com/thumbspage/UserGuide.html#other21
thishttps://learning-python.com/thumbspage/examples/2.2-upgrades/misc-gallery/index.html
thishttps://learning-python.com/thumbspage/examples/2.2-upgrades/index.html
filehttps://learning-python.com/thumbspage/UserGuide.html#Customization
herehttps://learning-python.com/thumbspage/examples/2.2-upgrades/misc-gallery/_thumbspage/tagline-off-sans-top.png.html
Androidhttps://learning-python.com/thumbspage/UserGuide.html#androidbrowserlocalviews
imageshttps://learning-python.com/thumbspage/UserGuide.html#enhancedthumbs21
layouthttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
changeshttps://learning-python.com/thumbspage/UserGuide.html#other21
herehttps://learning-python.com/thumbspage/examples/2.1-upgrades/index.html
herehttps://learning-python.com/thumbspage/examples/dynamiclayout/index.html
downloadhttps://learning-python.com/thumbspage.html#Download
filehttps://learning-python.com/thumbspage/user_configs.py
noisehttps://learning-python.com/thumbspage/examples/2.1-upgrades/H-highzoom-2.0-noise-and-blurry.png
blurhttps://learning-python.com/thumbspage/examples/2.1-upgrades/E-normzoom-2.0-vs-2.1-presets-1.png
gallerieshttps://learning-python.com/thumbspage/examples/2.1-upgrades/Z-2.1-index-pages-1.png
displayshttps://learning-python.com/thumbspage/examples/2.1-upgrades/Y-mobile-2.1-notblurry.jpg
generatedhttps://learning-python.com/thumbspage/examples/2.1-upgrades/_HOW-MADE.txt
black-and-whitehttps://learning-python.com/thumbspage/examples/2.1-upgrades/X-black-and-white-thumbs-mode.png
effectshttps://learning-python.com/thumbspage/examples/2.1-upgrades/X-way-too-much-tweaking.png
galleryhttps://learning-python.com/thumbspage/examples/2.1-upgrades/index.html
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
viewer_thumbs.pyhttps://learning-python.com/thumbspage/viewer_thumbs.py
columnshttps://learning-python.com/thumbspage/examples/2.1-upgrades/P-resized-dynamic-layout-narrow.png
single columnhttps://learning-python.com/thumbspage/examples/2.1-upgrades/P-mobile-dynamic-layout-wide-p.jpg
landscapehttps://learning-python.com/thumbspage/examples/2.1-upgrades/P-mobile-dynamic-layout-wide-l.jpg
contenthttps://learning-python.com/thumbspage/examples/2.1-upgrades/P-mobile-dynamic-layout-narrow-p.jpg
testedhttps://learning-python.com/thumbspage/examples/dynamiclayout/index.html
tableshttps://learning-python.com/thumbspage/examples/2.1-upgrades/Z-2.1-index-pages-1.png
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
sizehttps://duckduckgo.com/?q=css+units
filehttps://learning-python.com/thumbspage/user_configs.py
spacehttps://learning-python.com/thumbspage/examples/2.1-upgrades/P-zero-padding-dynamic-layout.png
galleryhttps://learning-python.com/thumbspage/examples/dynamiclayout/index.html
screenshotshttps://learning-python.com/thumbspage/examples/2.1-upgrades/_thumbspage/P-desktop-dynamic-layout-narrow.png.html
pagehttps://learning-python.com/thumbspage/examples/dynamiclayout/Demo-Wide-Filename-Labels/index.html
thumbspage.pyhttps://learning-python.com/thumbspage/thumbspage.py
inputshttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
release noteshttps://learning-python.com/thumbspage/UserGuide.html#configcmdargs22
notehttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout23
3.0https://learning-python.com/thumbspage/UserGuide.html#3.0
messagehttps://learning-python.com/thumbspage/examples/2.1-upgrades/_HOW-MADE.txt
aheadhttps://learning-python.com/thumbspage/UserGuide.html#builds21
linkshttps://learning-python.com/thumbspage/UserGuide.html#1.1
filehttps://learning-python.com/thumbspage/user_configs.py
valuehttps://duckduckgo.com/?q=css+units
screenshothttps://learning-python.com/thumbspage/examples/2.1-upgrades/N-subfolder-links-2.0-vs-2-1.png
demohttps://learning-python.com/thumbspage/examples/subfolders/index.html
taglinehttps://learning-python.com/thumbspage/examples/2.1-upgrades/N-subfolder-links-2.0-vs-2-1.png
footerhttps://learning-python.com/thumbspage/UserGuide.html#Customization
Imagehttps://learning-python.com/thumbspage/examples/subfolders/index.html
titleshttps://learning-python.com/thumbspage/examples/2.1-upgrades/O-imageless-folder-pages-default.png
taglinehttps://learning-python.com/thumbspage/examples/2.1-upgrades/O-imageless-folder-pages-custom.png
galleryhttps://learning-python.com/thumbspage/examples/2.1-upgrades/_thumbspage/N-subfolder-links-2.0-vs-2-1.png.html
querieshttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
imagelesshttps://learning-python.com/thumbspage/examples/console-logs/android.txt
galleryhttps://learning-python.com/thumbspage/examples/dynamiclayout/index.html
onhttps://learning-python.com/thumbspage/examples/2.1-upgrades/Q-auto-slideshow-on-indicator.png
offhttps://learning-python.com/thumbspage/examples/2.1-upgrades/Q-auto-slideshow-off-indicator.png
modehttps://learning-python.com/thumbspage/examples/2.1-upgrades/Z-2.1-viewer-pages-5-fullscreen.png
rotatedhttps://learning-python.com/thumbspage/UserGuide.html#rotation16
console loghttps://learning-python.com/thumbspage/examples/console-logs/2.1-embedded-thumbs-removal.txt
demohttps://learning-python.com/thumbspage/examples/reorientation/index.html
beforehttps://learning-python.com/thumbspage/examples/2.1-upgrades/R-embedded-thumbs-kept2.0.png
afterhttps://learning-python.com/thumbspage/examples/2.1-upgrades/R-embedded-thumbs-removed2.1.png
filehttps://learning-python.com/thumbspage/user_configs.py
backupshttps://learning-python.com/thumbspage/docetc/restore-prerotate-originals.py
codehttps://learning-python.com/thumbspage/viewer_thumbs.py
viewer_thumbs.pyhttps://learning-python.com/thumbspage/viewer_thumbs.py
herehttps://learning-python.com/thumbspage/UserGuide.html#GUI Mode
exampleshttps://learning-python.com/thumbspage/examples/
downloadshttps://learning-python.com/thumbspage.html#Download
web pagehttps://learning-python.com/thumbspage.html#Download
this scripthttps://learning-python.com/thumbspage/build/userguide-online-links.py
thishttps://learning-python.com/thumbspage/build/_PUBLISH.sh
thishttps://learning-python.com/thumbspage/build/generate-examples.py
thishttps://learning-python.com/thumbspage/build/insert-analytics.py
thishttps://learning-python.com/thumbspage/examples/2.0-upgrades/_generate.sh
thishttps://learning-python.com/thumbspage/examples/dynamiclayout/_generate.sh
buildhttps://learning-python.com/thumbspage/build
changehttps://learning-python.com/thumbspage/build/x-publish-external-demos.sh
generatehttps://learning-python.com/trnpix/_generate.sh
publishhttps://learning-python.com/trnpix/_publish.sh
demohttps://learning-python.com/trnpix/index.html
packagehttps://learning-python.com/thumbspage/
slideshowhttps://learning-python.com/thumbspage/examples/2.0-upgrades/auto-slideshow-view-normalfont.png
fullscreenhttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-mobile-fson.jpg
Top buttonhttps://learning-python.com/thumbspage/examples/2.0-upgrades/floating-top-custom-midpage.png
custom dialoghttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-camera-brand2-ch.png
device linehttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-mobile-android6inch-info2.jpg
stylinghttps://learning-python.com/thumbspage/examples/2.0-upgrades/overflow-wrap-index-foldername.png
live demoshttps://learning-python.com/thumbspage.html#demos
screenshotshttps://learning-python.com/thumbspage/examples/2.0-upgrades/index.html
Automatic slideshows for viewer pageshttps://learning-python.com/thumbspage/UserGuide.html#_201
Optional floating Top button for large index pageshttps://learning-python.com/thumbspage/UserGuide.html#_202
Optional one-page fullscreen display for viewer pageshttps://learning-python.com/thumbspage/UserGuide.html#_203
Improved horizontal-overflow styling for border caseshttps://learning-python.com/thumbspage/UserGuide.html#_204
The iOS Chrome history-stacking bug is no morehttps://learning-python.com/thumbspage/UserGuide.html#_205
Replacement-target comment in the headhttps://learning-python.com/thumbspage/UserGuide.html#_206
Show user-friendly messages on console-input errorshttps://learning-python.com/thumbspage/UserGuide.html#_20B
Info-popup: use a custom dialog instead of alert()https://learning-python.com/thumbspage/UserGuide.html#_20A
Info-popup: add Device (or Software) line if presenthttps://learning-python.com/thumbspage/UserGuide.html#_207
Info-popup: Taken=>Created if origin date unknownhttps://learning-python.com/thumbspage/UserGuide.html#_208
Info-popup: display dimensions as "Nw x Mh"https://learning-python.com/thumbspage/UserGuide.html#_209
Safari work-around: use HTML5 session storage for Autohttps://learning-python.com/thumbspage/UserGuide.html#_20C
Safari punt: Auto may stop (or crash) on Back to galleryhttps://learning-python.com/thumbspage/UserGuide.html#_20D
Silence a pointless and confusing Pillow DOS warninghttps://learning-python.com/thumbspage/UserGuide.html#_20E
Image auto-rotations are not optional in thumbspagehttps://learning-python.com/thumbspage/UserGuide.html#_20F
Auto buttonhttps://learning-python.com/thumbspage/examples/2.0-upgrades/auto-slideshow-view-android6inch-1.jpg
herehttps://learning-python.com/thumbspage/examples/2.0-upgrades/auto-slideshow-view-normalfont.png
demohttps://learning-python.com/thumbspage.html#demos
configs filehttps://learning-python.com/thumbspage/user_configs.py
Raw buttonhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hid-landscape.PNG
1.7https://learning-python.com/thumbspage/UserGuide.html#_174
browserhttps://duckduckgo.com/?q=Throttling+Javascript+Timers
Safarihttps://learning-python.com/thumbspage/UserGuide.html#moresafarijunk
coveragehttps://learning-python.com/thumbspage/UserGuide.html#slideshowbutton
proposalhttps://learning-python.com/thumbspage/UserGuide.html#_dnH
templatehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
herehttps://learning-python.com/thumbspage/examples/2.0-upgrades/demo-pagestate-basics/
herehttps://learning-python.com/thumbspage/examples/2.0-upgrades/demo-timerloop-basics/
indicatorhttps://learning-python.com/thumbspage/examples/2.1-upgrades/Q-auto-slideshow-on-indicator.png
notehttps://learning-python.com/thumbspage/UserGuide.html#21autofull
warninghttps://learning-python.com/thumbspage/examples/2.0-upgrades/javascript-desktop-viewpage-off.png
experiencehttps://learning-python.com/thumbspage/examples/2.0-upgrades/javascript-desktop-viewpage-on.png
notehttps://learning-python.com/thumbspage/UserGuide.html#_vt1
Top buttonhttps://learning-python.com/thumbspage/examples/2.0-upgrades/floating-top-default-footer.png
herehttps://learning-python.com/thumbspage/examples/2.0-upgrades/_thumbspage/floating-top-custom-footer.png.html
herehttps://learning-python.com/trnpix/index.html
configs filehttps://learning-python.com/thumbspage/user_configs.py
template-floatingtop.htmlhttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-floatingtop.html
filehttps://learning-python.com/thumbspage/UserGuide.html#Customization
herehttps://learning-python.com/thumbspage/examples/2.0-upgrades/floating-top-default-footer.png
similarhttps://learning-python.com/thumbspage/examples/2.0-upgrades/floating-top-custom-footer.png
displayshttps://learning-python.com/thumbspage/examples/2.0-upgrades/floating-top-mobile-ios4inch.PNG
Full buttonhttps://learning-python.com/thumbspage/examples/2.0-upgrades/fullscreen-mobile-fsoff.jpg
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
herehttps://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API
notehttps://learning-python.com/thumbspage/UserGuide.html#fullscreenmanual
codehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
activatedhttps://learning-python.com/thumbspage/examples/2.1-upgrades/Z-2.1-viewer-pages-5-fullscreen.png
notehttps://learning-python.com/thumbspage/UserGuide.html#21autofull
filehttps://learning-python.com/thumbspage/user_configs.py
warninghttps://learning-python.com/thumbspage/examples/2.0-upgrades/javascript-mobile-viewpage-off.jpg
platformshttps://learning-python.com/thumbspage/UserGuide.html#fullscreenmanual
thishttps://learning-python.com/thumbspage/examples/2.0-upgrades/overflow-wrap-index-foldername.png
beforehttps://learning-python.com/thumbspage/examples/2.0-upgrades/overflow-wrap-viewer-fileandtoolbar1.png
afterhttps://learning-python.com/thumbspage/examples/2.0-upgrades/overflow-wrap-viewer-fileandtoolbar2.png
fileshttps://learning-python.com/thumbspage/UserGuide.html#Customization
generatorhttps://learning-python.com/thumbspage/thumbspage.py
template. https://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
release noteshttps://learning-python.com/thumbspage/UserGuide.html#destacking16
config-filehttps://learning-python.com/thumbspage/user_configs.py
fileshttps://learning-python.com/thumbspage/UserGuide.html#Customization
this scripthttps://learning-python.com/thumbspage/build/insert-analytics.py
buildhttps://learning-python.com/thumbspage/build
console loghttps://learning-python.com/thumbspage/examples/console-logs/2.0-console-errors.txt
scripthttps://learning-python.com/thumbspage/thumbspage.py
dialoghttps://learning-python.com/thumbspage/examples/1.7-upgrades/info-dialog-chrome-mobile.png
dialoghttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-mobile-android6inch-info2.jpg
template filehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
captureshttps://learning-python.com/thumbspage/examples/2.0-upgrades/index.html
galleryhttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/index.html
usagehttps://developers.google.com/web/updates/2017/03/dialogs-policy
silencehttps://duckduckgo.com/?q=Prevent+this+page+from+creating+additional+dialogs
neededhttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-x-ios4inch-hide-port.PNG
settingshttps://learning-python.com/thumbspage/user_configs.py
appearancehttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-xx-color-configs2.png
herehttps://learning-python.com/thumbspage/UserGuide.html#popupcolors23
herehttps://learning-python.com/thumbspage/UserGuide.html#popupopacity23
standardhttps://www.exif.org/Exif2-2.PDF
escapeshttps://learning-python.com/thumbspage/UserGuide.html#buglets23
devicehttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-camera-only1.png
brandhttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-camera-brand2-ch.png
softwarehttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-software2.png
taghttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-none1.png
galleryhttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/index.html
live demohttp://learning-python.com/trnpix/
open endedhttps://learning-python.com/thumbspage/UserGuide.html#_dnI
photohttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-camera-brand1-ff.png
scanhttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-scanner2.png
drawnhttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-software2.png
filesystemhttps://en.wikipedia.org/wiki/Comparison_of_file_systems#Metadata
os.path.getctime()https://docs.python.org/3/library/os.path.html#os.path.getctime
searcheshttps://duckduckgo.com/?q=filesystem+creation+date
viewshttps://learning-python.com/thumbspage/UserGuide.html#_vt8
in fullhttps://learning-python.com/thumbspage/UserGuide.html#msjepilogue
anotherhttps://learning-python.com/thumbspage/UserGuide.html#egokillscode17
file's sourcehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
herehttps://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage
herehttps://www.w3schools.com/html/html5_webstorage.asp
aheadhttps://learning-python.com/thumbspage/UserGuide.html#msjepilogue
falsyhttps://developer.mozilla.org/en-US/docs/Glossary/Falsy
notorioushttps://duckduckgo.com/?q=%22The+operation+couldn%27t+be+completed.+Operation+not+permitted%22+(NSPOSIXErrorDomain%3A1)
dialoghttps://learning-python.com/thumbspage/examples/2.0-upgrades/_etc/bogus-safari-local-gallery-error-dialog.png
galleries on mobile altogether (but watch for later clues in the epilogue). In the possibly related department, it's worth noting that, both with and without the change to use session storage, Safari also produces an uncatchable exception on Auto image switch, which leaves the following suspicious error message in the JavaScript console: Not allowed to load local resource: file:///favicon.ico This happens only for local-file views just like the initial Auto-slideshow failures, but there appears to be no cause-and-effect relationship between the two: the exception also occurs on Next and Prev taps, and isn't remedied by disabling local-file restrictions in the Develop menu or pasting a valid favicon into the folder. Just as strangely, a Back in Safari, only, does not run (or properly run) resize handlers in remote galleries: if the window is resized while away, the gallery doesn't catch up until the next page in the show or a forced reload. By contrast, a Safari Back does resize local-file galleries, but also kills their shows by clearing storage (and sometimes crashing). No other tested browser has these issues. thumbspage tried multiple work-arounds to address the Safari failures—including moving timer rescheduling from top-level code to pageshow event handler; forcibly cancelling timers on page unloads; and forcibly reloading the page when reshown. Some of these were meant to address the theory (really, wild guess) that failures stemmed from the browser's back-forward cache. For example, the first of these used top-level JavaScript code of this form: function autoContinue(event) { // former top-level reschedule code of prior note } try { trace('run timer-reschedule code deferred'); window.addEventListener('pageshow', autoContinue); } catch (err) { trace('run timer-reschedule code immediately'); autoContinue(null); // run now in older browsers (or: window.onpageshow) } None of these attempts helped as coded. Whether overzealous security constraints, cache optimization schemes gone bad, or outright bugs, something is clearly amiss in Safari local-file views that use session storage and timers. As a more radical alternative, HTML5 localStorage, unlike sessionStorage, might not be erroneously cleared by Safari on Back, but this may not fix the crashes, and is too broad and persistent to be used in any event: a site's slideshow toggle would then be machine global, enduring to apply to later shows in ways users seem unlikely to expect—or appreciate. Downgrading user experience this way for every browser is not a valid fix for the foibles of one. The upside here is that slideshows do work well in all other browsers, and work well in Safari most of the time too, after moving to session storage. They're currently known to fail only on switching from and to local galleries in specific Safaris; this is a rare—and even unlikely—use case. Nevertheless, given that this Safari glitch has all the hallmarks of a browser-vendor bug, and has stubbornly defied all work-around heroics to date, it will have to remain an out-of-scope caveat for thumbspage 2.0. If this Safari quirk crops up in your thumbspage adventures, your best recourses are to tap Auto again to restart the show when possible; use an alternative browser that's less broken; or lobby Apple to fix its junk. Epilogue: after the above was written, further usage revealed that a Back in Safari sometimes stops Auto slideshows for all-remote (i.e., online) navigation too, if users leave to another domain (i.e., site) and return to the slideshow page. That is, Safari's Back glitch may also be triggered by a domain switch. Just as importantly, all-remote stops appear to happen only in the desktop Safari browser—not in mobile Safari on iOS 13, and not in a dozen other browsers tested among Windows, macOS, Linux, and Android. In more detail, Safari, only, is now also known to stop an Auto slideshow running in an https:// page, after navigating to another https:// page at a different domain, and returning to the https:// slideshow page with Back. This does not happen for all such remote switches, however. Curiously—and perhaps entertainingly—a slideshow running at https://learning-python.com rarely stops when switching to and from https://apple.com, but reliably does when the navigation target is https://google.com. HTML5 session storage should endure for all like-kind pages visited in a browser tab (or window). It's specific to page protocol and domain by definition (see here, here, and here), so it's expected to start fresh when navigating from a file:// page to https://, or to a new site in https://. But a prior page's session storage should also be restored and/or intact when a Back returns in both of these contexts, and neither a protocol- nor domain-switching Back should ever crash the browser. Only Safari bears these warts. There's certainly more to this story, but forensics sans code is guesswork, and we'll have to leave this bug tale here. Whatever the underlying cause, this is clearly an issue for Apple to resolve; until it does, the work-around for thumbspage users remains an Auto-press restart, or an alternative-browser install. Today's desktop Safari seems far too prone to toss its cookies (or at least its session storage...). Silence a pointless and confusing Pillow DOS warning thumbspage 2.0 was patched and rereleased in September 2020 to silence a bogus DecompressionBombWarning message now issued senselessly by the underlying Pillow library for all large images. Because the fix does not in any way alter the galleries which thumbspage builds, none need be regenerated; this mutes one build-time message only. Specifically, when building galleries with images larger than 89MP, the Pillow library by default prints a single DOS (denial of service) warning message in program output that looks like this (with line-breaks added here for marginal readability): /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/PIL/Image.py:2797: DecompressionBombWarning: Image size (108000000 pixels) exceeds limit of 89478485 pixels, could be decompression bomb DOS attack. warnings.warn( This baseless warning is completely harmless, and does not impact thumbspage results; large images work fine in thumbspage galleries whether this message appears or not. But it's also stupidly excessive, and needlessly confuses users of this and many other Pillow-based programs. The message's over-strong language may even scare some users over a threat that doesn't exist. The warning was first seen for valid 108MP images shot on a Galaxy Note20 Ultra smartphone in 2020, and will crop up for all the increasingly common large images created by newer devices and tools. While the fix to silence the spurious warning may be trivial for program developers, program users have no recourse, and are left wondering if programs are buggy—or worse! To see the fix's code for yourself, search for Sep-2020 in the source. Though simple, a "fix" is often far easier than a release. At thumbspage's host site, multiple programs were impacted—including thumbspage, tagpix, shrinkpix, and PyPhoto—and each required time-consuming retesting, repackaging, and redistribution. This warning might be useful in some contexts, but it clearly should have required an enable, not a disable. Unfortunately, opt out is a regular by-product of opinion on overdrive. Lesson: open-source agendas have consequences for others, and "batteries included" development entails substantial trade-offs. While this program could not easily exist without libraries like Pillow, it's also woefully dependent on them—even when they serve as platforms for personal preferences and subjective changes that stomp on the work of others. So don't be rude out there. Postscript: though scantly documented, it turns out that Pillow later turned the warning described here into a full error for images larger than twice the warning's size limit. Though unlikely, this error takes the form of an exception that will cause client programs to fail or terminate. Despite this, its only mention seems to be in an obscure release note; whose details contradict an earlier obscure release note; and require studying Pillow's source code for full fidelity. To avoid large-image Pillow errors, thumbspage's warning-silencing code has been updated to use a new and broader fix that sets Image.MAX_IMAGE_PIXELS to None—which will, of course, suffice only until Pillow tightens the screws again. Large images are not all attacks, and their creators are hardly ever criminals; unless it really means to anger programmers and insult users, Pillow should really think about making this check both opt in and better documented. Image auto-rotations are not optional in thumbspage Short story: version 2.0 explored the idea of dropping rotations (a.k.a. reorientations) of tilted images in thumbspage, by propagating sources' Exif orientation tags to their thumbnails and relying on browsers to rotate. This was rejected because browsers still don't support rotations universally in fall 2020. Browsers widely straighten images displayed alone, but not images displayed as in-page elements—like those in thumbspage index and viewer pages. To be inclusive of all users, thumbspage must rotate images itself, because some browsers still don't, and even some that do today did not rotate in versions released just a year or two ago. This note discusses the alternative proposal and its later rejection, as developer-oriented information only; no changes were made, but the story is typical of browser-dependent UI development. The Proposal Summary: although thumbspage image rotations work well and as designed, recent findings suggest that it may be possible to implement thumbspage without rotations altogether, by propagating tags from sources to thumbnails. This hasn't yet been fully verified and no thumbspage changes have been implemented—mostly because programs that work don't generally need to be fixed—but this section provides background on non-rotation alternatives. Details: to get started, we first need to understand the current rotation policy. Given a tilted source image coded with a non-"normal" Exif orientation tag (of the sort commonly had from smartphones held vertically), thumbspage today follows an evolved procedure to reorient images for in-page display that works like this: Rotate the source in memory to be right-side up Back up the source's file to a .original copy Save the rotated source to its file, with updated orientation, width, and height Exif tags Make and save a thumbnail from the rotated source The first three of these steps can be turned off on a per-build-run basis by a user configuration; if so disabled, thumbnails aren't rotated either, just because they're built from unrotated sources. This scheme arose in phases over multiple versions and releases. thumbspage 1.5 displayed images too naively to count; 1.6 added auto-rotation of tilted sources, and their thumbnails by proxy; and 1.7 added Exif orientation-tag update and propagation for rotated source images (thumbs are simply built from already-straightened sources). The combination of these yields the procedure above, which is harmless for builders and viewers, and ensures that both sources and thumbs display right-side up in all contexts, regardless of their original orientation, and despite the vagaries of web-browser support. Like much in computing, though, there may be alternative ways to do this. Per later research, it now appears that thumbspage may be able to skip rotations for both source images and their thumbnails altogether, as long as sources' orientation tags are propagated to their thumbnails. A non-rotation option is too involved to cover in full here, and is outside the scope of version 2.0. But the facts behind this alternative merit a few words. In short, the JavaScript DOM seems to account for image orientation automatically in both its image properties and display. Specifically, the standard's doc here says this on the subject: The IDL attributes naturalWidth and naturalHeight must return the density-corrected intrinsic width and height of the image, in CSS pixels, if the image has intrinsic dimensions and is available, or else 0. ... Since the intrinsic dimensions of an image take into account any orientation specified in its metadata, naturalWidth and naturalHeight reflect the dimensions after applying any rotation needed to correctly orient the image, regardless of the value of the 'image-orientation' property. In other words, the DOM's "natural" sizes in JavaScript are already corrected for right-side-up display. The doc doesn't explicitly state that images themselves will be displayed this way when rendered as in-page elements, but this seems the case for a handful of major browsers in recent tests so far. Because thumbspage has used the DOM's natural width and height in its dynamic image scaling since 1.6, it sizes the image for display in a viewer page with orientation already "baked in." By contrast, version 1.5 used the Pillow library's build-time width and height, which are not corrected for orientation the way that the DOM properties are; the result is an unscaled image auto-rotated by the same browsers, but stretched into pre-rotation dimensions. Given the DOM's definition—and assuming every browser of interest implements an arguably implicit reorientation for in-page display—thumbspage's own reorientation of the source image is not required. Reorientation of thumbnails may similarly be unnecessary, but only as long as the source's orientation tag is propagated unchanged to the thumb to force the browser's adjustment. In sum, the alternative non-rotating procedure would: Make a thumbnail from the source in memory Copy the source's Exif orientation tag to the thumbnail Save the thumbnail to a file And hope that every browser on the planet does the right thing for in-page display of unstraightened images, both source and thumb This seems simpler, and may be, but it still must propagate updated tags using the piexif library (and fix tags known to make that library fail); requires the image-info popup to get dimensions from the JavaScript DOM instead of build-time Pillow (else they may appear swapped); and adds a browser-support dependency that the current scheme evades (and these are almost always best evaded). On the other hand, the source image would remain unchanged. The required tag propagation of step 2 in the alternative scheme wasn't considered in 1.6 because it wasn't implemented until thumbspage 1.7. Prior to that, thumbnails made from unrotated sources were askew just because they had no orientation tag (and rotated source images were askew if their tags were copied but not updated). Rotating the source solved the issue in 1.6, but may now seem overkill. All of which sounds simpler in hindsight, but thumbspage's scheme arose in piecemeal fashion over years, and cannot easily be modified today. While it's possible to disable thumbspage's auto-rotations process by setting autoRotateImages to False in user_configs.py, this leaves thumbs tilted: because they're currently built from source images without copying the source's orientation tag, they will display askew. Hence, either the source must be rotated first (as done currently), or code must be changed to skip rotations and propagate source tags to thumbs. And any change must also be predicated on universal browser support for reorientations. For now, thumbspage's reorientation scheme works as intended, has been used successfully for years, and incurs no penalties apart from the minor overhead of .original backups. While rotations might be rendered superfluous with redesign and recoding, it's difficult to justify fixing a program with such a positive marketing story. In its role as example for learners, however, thumbspage follows a full-disclosure policy—even when that means pointing out its own rooms for possible improvement. The Rejection Stop the presses: the non-rotating alternative proposed in the preceding section proved to be unusable after testing revealed that browser support for reorientation of images displayed as in-page elements is still coming online, and nowhere near the universal level required even on the latest platforms. Hence, in the name of inclusiveness, thumbspage will continue to rotate source and thumbnail images itself, because some browsers don't. Details: although Exif orientation support has appeared in some browsers by fall 2020, a more complete analysis reveals that this is a very recent feature that has been appearing slowly. Along the way, its course included a CSS property that aimed to force the issue, but had weak support and was deprecated in favor of automatic adjustment. While automatic reorientation seems on track to becoming the norm in years ahead, it won't be present in versions of some browsers released just one or two years ago, and may never be adopted by others. As a sample of where this support lies today, the following table summarizes auto-rotation findings for desktop and mobile browsers, as compiled empirically by thumbspage's testing department in October 2020; a "No" in the leftmost column means the browser doesn't adjust for orientation when displaying images as in-page elements: Rotates Device OS Browser Version Released No Desktop macOS 10.15 Firefox 70 Oct-2019 No Desktop macOS 10.15 Safari 13 Sep-2019 Yes Desktop macOS 10.15 Firefox 78 Jul-2020 Yes Desktop macOS 10.15 Chrome 85 Aug-2020 No Desktop Windows 7 Chrome 77 Sep-2019 No Desktop Windows 7 Firefox 56 Sep-2017 No Desktop Windows 7 IE 9 (unknown) No Desktop Windows 10 IE 11 (unknown) Yes Desktop Windows 10 Firefox 78 Jun-2020 Yes Desktop Windows 10 Chrome 85 Aug-2020 Yes Desktop Windows 10 Edge 85 2020 No Mobile Android 7 Firefox 65 Jan-2019 Yes Mobile Android 7 Chrome 81 Apr-2020 No Mobile Android 10 Samsung 12 Jun-2020 Yes Mobile Android 10 Chrome 85 Aug-2020 Yes Mobile Android 10 Firefox 81 Oct-2020 Yes Mobile iOS 13 Safari 13 Sep-2019 Yes Mobile iOS 13 Chrome 84 Jul-2019 For a more graphical look at these results, open the examples' thumbspage-screenshots gallery. As you can see, auto-rotation has come to some browsers in just the last year, and others still don't support it at all in fall 2020. On both desktop and mobile devices, current and recent versions of widely used web browsers still show orientation-coded images askew. Which nicely captures a dilemma constantly facing engineers who work in a field as dynamic as software. Dropping its own reorientation might make sense if thumbspage could restrict its scope to just the latest-and-greatest browsers and versions. As a program designed to build galleries inclusive of all viewers, though, this is not an option. Even for browsers that have added the required support recently, versions just a few years old will still be common for years to come (despite the best efforts of their vendors). Because we don't live in a world that restarts afresh each release cycle, thumbspage cannot be changed to rely on browsers to reorient tilted images any time soon. While this might trim some program complexity, it wouldn't work for many thumbspage-gallery viewers today, and requiring browser updates or replacements just to view thumbspage galleries would both be too extreme, and almost certainly qualify as rude (see the prior note). For hard-core readers: the following Python session demos one way to do the source-to-thumb tag propagation which was tested but ruled out; Pillow also has some support for reading tags and processing them as a bytes blob (see reorientImage in viewer_thumbs.py), but little to match piexif when it comes to updating tags: >>> from PIL import Image >>> import piexif >>> it = Image.open('2020-09-17__180904.jpg') # unreoriented thumb >>> es = piexif.load('../2020-09-17__180904.jpg') # source tags (unreoriented) >>> et = piexif.load('2020-09-17__180904.jpg') # thumb tags (none yet) >>> es['0th'][piexif.ImageIFD.Orientation] 6 >>> et {'0th': {}, 'Exif': {}, 'GPS': {}, 'Interop': {}, '1st': {}, 'thumbnail': None} >>> >>> et['0th'][piexif.ImageIFD.Orientation] = es['0th'][piexif.ImageIFD.Orientation] >>> et['0th'][piexif.ImageIFD.Orientation] 6 >>> saveexifs = piexif.dump(et) >>> saveexifs[:20] b'Exif\x00\x00MM\x00*\x00\x00\x00\x08\x00\x01\x01\x12\x00\x03' >>> it.save('2020-09-17__180904.jpg', exif=saveexifs) It's also worth noting that Pillow's ImageOps module has a call exif_transpose(image) that straightens images and simply deletes their Exif orientation tags, but this call also discards all other Exif tags if its result is saved directly; per warnings, seems to have even more issues parsing tags than piexif; and wouldn't make logistics any easier here in any event—regardless of how rotation is coded, Exif tags must be propagated to sources for display, and thumbs and sources must be saved to files in reoriented form because both are displayed in thumbspage galleries as in-page elements that aren't automatically righted by many browsers: >>> from PIL import ImageOps >>> it = Image.open('../2020-09-17__180904.jpg') # unreoriented source >>> ir = ImageOps.exif_transpose(it) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:588: UserWarning: Metadata Warning, tag 282 had too many entries: 2, expected 1 warnings.warn( /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:588: UserWarning: Metadata Warning, tag 283 had too many entries: 2, expected 1 warnings.warn( /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/PIL/TiffImagePlugin.py:588: UserWarning: Metadata Warning, tag 34853 had too many entries: 6, expected 1 warnings.warn( >>> ir.save('rotated.jpg') # simple saves drop Exif tags >>> piexif.load('rotated.jpg') {'0th': {}, 'Exif': {}, 'GPS': {}, 'Interop': {}, '1st': {}, 'thumbnail': None} >>> piexif.load('../2020-09-17__180904.jpg') {'0th': {256: 4000, 257: 3000, 271: b'samsung', 272: b'SM-N986U1'... # and a lot more In the end—and with all the evidence in—thumbspage did the right rotations thing in 2018 and still does in 2020. Its universally portable image reorientation still beats the partial support among browsers today (even if readers 10 years down the pike may not think so). https://learning-python.com/thumbspage/UserGuide.html#_vt8
epiloguehttps://learning-python.com/thumbspage/UserGuide.html#msjepilogue
back-forward cachehttps://duckduckgo.com/?q=safari+back-forward+cache
globalhttps://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
herehttps://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage
herehttps://www.w3schools.com/html/html5_webstorage.asp
herehttps://html.spec.whatwg.org/multipage/webstorage.html#webstorage
Pillowhttps://pypi.org/project/Pillow/
imageshttps://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.open
programshttps://duckduckgo.com/?q=Pillow+DecompressionBombWarning
sourcehttps://learning-python.com/thumbspage/viewer_thumbs.py
thumbspagehttps://learning-python.com/thumbspage.html
tagpixhttps://learning-python.com/tagpix.html
shrinkpixhttps://learning-python.com/shrinkpix.html
PyPhotohttps://learning-python.com/pygadgets.html
release notehttps://pillow.readthedocs.io/en/stable/releasenotes/5.0.0.html
release notehttps://pillow.readthedocs.io/en/stable/releasenotes/4.2.0.html
source codehttps://pillow.readthedocs.io/en/stable/_modules/PIL/Image.html?highlight=MAX_IMAGE_PIXELS
broader fixhttps://learning-python.com/thumbspage/viewer_thumbs.py
indexhttps://learning-python.com/thumbspage/examples/reorientation/index.html
viewerhttps://learning-python.com/thumbspage/examples/reorientation/_thumbspage/galaxys8-6R.jpg.html
don'thttps://learning-python.com/thumbspage/examples/reorientation/Unrotated-images-in-browsers/_thumbspage/m-android10-NO-samsung-12-source.jpg.html
agohttps://learning-python.com/thumbspage/examples/reorientation/Unrotated-images-in-browsers/index.html
proposalhttps://learning-python.com/thumbspage/UserGuide.html#tpsansrotates_proposal
rejectionhttps://learning-python.com/thumbspage/UserGuide.html#tpsansrotates_rejection
configurationhttps://learning-python.com/thumbspage/user_configs.py
auto-rotationhttps://learning-python.com/thumbspage/UserGuide.html#rotation16
propagationhttps://learning-python.com/thumbspage/UserGuide.html#_17C
herehttps://html.spec.whatwg.org/multipage/embedded-content.html#dom-img-naturalwidth
failhttps://learning-python.com/thumbspage/UserGuide.html#_17G
popuphttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-camera-brand1-ff.png
besthttps://learning-python.com/thumbspage/UserGuide.html#_205
evadedhttps://learning-python.com/thumbspage/UserGuide.html#_17F
askewhttps://learning-python.com/thumbspage/examples/Screenshots/reorient-prior-index.png
updatedhttps://learning-python.com/thumbspage/examples/Screenshots/reorient-prior-viewer.png
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
CSS propertyhttps://developer.mozilla.org/en-US/docs/Web/CSS/image-orientation
galleryhttps://learning-python.com/thumbspage/examples/reorientation/Unrotated-images-in-browsers/index.html
notehttps://learning-python.com/thumbspage/UserGuide.html#pillowdoswarning
viewer_thumbs.pyhttps://learning-python.com/thumbspage/viewer_thumbs.py
piexifhttps://pypi.org/project/piexif/
piexifhttps://learning-python.com/thumbspage/UserGuide.html#piexifworkaround
2018https://learning-python.com/thumbspage/UserGuide.html#1.6
2020https://learning-python.com/thumbspage/examples/reorientation/Unrotated-images-in-browsers/index.html
popuphttps://learning-python.com/thumbspage/examples/1.7-upgrades/info-dialog-chrome-mobile.png
displayhttps://learning-python.com/thumbspage/examples/Screenshots/scaling-android-raw-landscape.png
togetherhttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-buttons-fixed.png
displayshttps://learning-python.com/thumbspage/examples/1.7-upgrades/image-larger-desktop-1.7.png
browsershttps://learning-python.com/thumbspage/UserGuide.html#drophover17
popupshttps://learning-python.com/thumbspage/examples/1.7-upgrades/info-dialog-chrome-desktop.png
GIFshttps://learning-python.com/thumbspage/UserGuide.html#thumbnails17
imageshttps://learning-python.com/thumbspage/UserGuide.html#rotateskeepexifs
folder namehttps://learning-python.com/thumbspage/UserGuide.html#otherusagemodes
gallerieshttps://learning-python.com/thumbspage/UserGuide.html#imagesizeandspeed
for youhttp://learning-python.com/shrinkpix.html
popupshttps://learning-python.com/thumbspage/UserGuide.html#digitzedscanlabel17
browsershttps://learning-python.com/thumbspage/UserGuide.html#iosscale17
pageshttps://learning-python.com/thumbspage/UserGuide.html#iostextupscale17
libraryhttps://learning-python.com/thumbspage/UserGuide.html#Installs and Platforms
June patchhttps://learning-python.com/thumbspage/UserGuide.html#piexifworkaround
code fileshttps://learning-python.com/thumbspage/
screenshots pagehttps://learning-python.com/thumbspage/examples/1.7-upgrades/index.html
Avoid image clipping at large font settingshttps://learning-python.com/thumbspage/UserGuide.html#_171
Avoid button run-together at very large font settingshttps://learning-python.com/thumbspage/UserGuide.html#_172
Open a new info popup dialog on filename click/taphttps://learning-python.com/thumbspage/UserGuide.html#_173
Open the full image on image click/tap, just like Rawhttps://learning-python.com/thumbspage/UserGuide.html#_174
Note version number and generation date in all pageshttps://learning-python.com/thumbspage/UserGuide.html#_175
Viewer-pages and clean-thumbs default to yes in console promptshttps://learning-python.com/thumbspage/UserGuide.html#_176
Allow folder name to be passed in as a command-line argumenthttps://learning-python.com/thumbspage/UserGuide.html#_177
Skip Unix .* hidden names in subfolders bullet listshttps://learning-python.com/thumbspage/UserGuide.html#_178
Remove tkinter dependency for building on Androidhttps://learning-python.com/thumbspage/UserGuide.html#_179
Drop hover italics/underline effects for toolbar buttonshttps://learning-python.com/thumbspage/UserGuide.html#_17A
Improve thumbnail quality for shrunken images and GIFs (Mar)https://learning-python.com/thumbspage/UserGuide.html#_17B
Retain—and update—Exif tags in rotated JPEG images (Mar)https://learning-python.com/thumbspage/UserGuide.html#_17C
Index pages: avoid text upscaling in iOS Safari landscape (May)https://learning-python.com/thumbspage/UserGuide.html#_17D
Info popup: label scans as "Digitized" instead of "Taken" (May)https://learning-python.com/thumbspage/UserGuide.html#_17E
iOS landscape: use JavaScript image scaling in all browsers (May)https://learning-python.com/thumbspage/UserGuide.html#_17F
piexif work-around: fix rare failures on some rotated images (Jun)https://learning-python.com/thumbspage/UserGuide.html#_17G
borderhttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-clip-prefix-border.png
contenthttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-clip-prefix-content.png
desktophttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-clip-desktop-prefix.png
herehttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-clip-fixed-large.png
herehttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-clip-fixed-normal.png
herehttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-clip-desktop-fixed.png
run togetherhttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-buttons-prefix.png
herehttps://learning-python.com/thumbspage/examples/1.7-upgrades/largefont-buttons-fixed.png
herehttps://learning-python.com/thumbspage/examples/1.7-upgrades/_thumbspage/image-larger-desktop-1.6.png.html
exampleshttps://learning-python.com/thumbspage/examples/
demoshttp://learning-python.com/thumbspage.html#demos
notehttps://learning-python.com/thumbspage/UserGuide.html#_204
template filehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
desktophttps://learning-python.com/thumbspage/examples/1.7-upgrades/info-dialog-chrome-desktop.png
mobilehttps://learning-python.com/thumbspage/examples/1.7-upgrades/info-dialog-chrome-mobile.png
Exifhttps://en.wikipedia.org/wiki/Exif
standardhttps://www.exif.org/Exif2-2.PDF
aheadhttps://learning-python.com/thumbspage/UserGuide.html#_17E
custom dialoghttps://learning-python.com/thumbspage/examples/2.0-upgrades/MORE-INFO-POPUP/info-custom-camera-brand1-ff.png
release notehttps://learning-python.com/thumbspage/UserGuide.html#infocustom20
maker linehttps://learning-python.com/thumbspage/UserGuide.html#_207
imageshttps://learning-python.com/thumbspage/UserGuide.html#_208
2.2https://learning-python.com/thumbspage/UserGuide.html#2.2
2.3https://learning-python.com/thumbspage/UserGuide.html#2.3
browserhttps://learning-python.com/thumbspage/examples/Screenshots/scaling-norm-raw.png
normalhttps://learning-python.com/thumbspage/examples/Screenshots/scaling-android-landscape.png
tappedhttps://learning-python.com/thumbspage/examples/Screenshots/scaling-android-raw-landscape.png
slideshowshttps://learning-python.com/thumbspage/UserGuide.html#slideshow20
utility scripthttps://learning-python.com/thumbspage/docetc/cmp-thumbspage-results.py
replyhttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
exampleshttps://learning-python.com/thumbspage/examples/console-logs/
earlierhttps://learning-python.com/thumbspage/UserGuide.html#otherusagemodes
exampleshttps://learning-python.com/thumbspage/examples/console-logs/
2.2https://learning-python.com/thumbspage/UserGuide.html#2.2
2.3https://learning-python.com/thumbspage/UserGuide.html#2.3
this modulehttps://learning-python.com/thumbspage/viewer_thumbs.py
modehttps://learning-python.com/thumbspage/UserGuide.html#GUI Mode
Termuxhttps://termux.com/
Pydroid 3https://play.google.com/store/apps/details?id=ru.iiec.pydroid3
noteboxhttps://learning-python.com/thumbspage/UserGuide.html#androidnote
twohttps://learning-python.com/thumbspage/examples/1.7-upgrades/note10-samsung-stylus-cursor.jpg
formerlyhttps://learning-python.com/thumbspage/examples/1.7-upgrades/x-hover-effects-before-1.6.png
abovehttps://learning-python.com/thumbspage/UserGuide.html#filenametap
as of 1.7https://learning-python.com/thumbspage/examples/1.7-upgrades/x-hover-effects-after-1.7.png
this MDN pagehttps://developer.mozilla.org/en-US/docs/Web/CSS/:hover
this searchhttps://duckduckgo.com/?q=ios+hover+double+tap&ia=web
Samsung's browserhttps://learning-python.com/thumbspage/examples/1.7-upgrades/note10-samsung-stylus-cursor.jpg
improvedhttps://learning-python.com/thumbspage/examples/1.7-upgrades/zz-gif-thumbs-after-rbga.png
abovehttps://learning-python.com/thumbspage/UserGuide.html#imagesizeandspeed
shrinkpixhttp://learning-python.com/shrinkpix.html
beforehttps://learning-python.com/thumbspage/examples/1.7-upgrades/zz-gif-thumbs-before-rbga.png
afterhttps://learning-python.com/thumbspage/examples/1.7-upgrades/zz-gif-thumbs-after-rbga.png
viewer-thumbs.pyhttps://learning-python.com/thumbspage/viewer_thumbs.py
notehttps://learning-python.com/thumbspage/UserGuide.html#enhancedthumbs21
popupshttps://learning-python.com/thumbspage/examples/1.7-upgrades/rotate-exifs1-info-taken.png
auto-rotationhttps://learning-python.com/thumbspage/UserGuide.html#rotation16
Exifhttps://en.wikipedia.org/wiki/Exif
standardhttps://www.exif.org/Exif2-2.PDF
abovehttps://learning-python.com/thumbspage/UserGuide.html#filenametap
this pagehttps://learning-python.com/thumbspage/examples/reorientation/_thumbspage/galaxys8-3U.jpg.html
Raw modehttps://learning-python.com/thumbspage/examples/1.7-upgrades/rotate-exifs3-raw-SANSupdates.png
date takenhttps://learning-python.com/thumbspage/examples/1.7-upgrades/rotate-exifs1-info-taken.png
the Raw apeshttps://learning-python.com/thumbspage/examples/1.7-upgrades/rotate-exifs2-raw.png
piexif libraryhttps://pypi.org/project/piexif/
packagehttps://learning-python.com/thumbspage/piexif/
aheadhttps://learning-python.com/thumbspage/UserGuide.html#piexifworkaround
herehttps://learning-python.com/thumbspage/UserGuide.html#tpsansrotates
updatehttps://learning-python.com/thumbspage/UserGuide.html#21rotations
filehttps://learning-python.com/thumbspage/user_configs.py
filehttps://learning-python.com/thumbspage/UserGuide.html#Customization
thishttps://learning-python.com/thumbspage/examples/1.7-upgrades/digitized-fix-scan-after.jpg
standardhttps://www.exif.org/Exif2-2.PDF
tagpixhttp://learning-python.com/tagpix.html
scanhttps://learning-python.com/thumbspage/examples/1.7-upgrades/digitized-fix-scan-before.jpg
camerahttps://learning-python.com/thumbspage/examples/1.7-upgrades/digitized-other-photo.jpg
scannedhttps://learning-python.com/thumbspage/examples/1.7-upgrades/digitized-fix-scan-after.jpg
screenshothttps://learning-python.com/thumbspage/examples/1.7-upgrades/digitized-other-shot.jpg
try thishttps://en.wikipedia.org/wiki/Exif#Problems
testedhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-scaled-landscape-ch.png
behaviorhttps://learning-python.com/thumbspage/examples/1.7-upgrades/image-larger-mobile-1.7.jpg
oncehttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-new-1t.png
imagehttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-new-2b.png
beforehttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-old-2b.PNG
ideallyhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hid-landscape.PNG
menuhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hide-toolbars.PNG
viewshttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-old-1t.PNG
filehttps://learning-python.com/thumbspage/user_configs.py
herehttps://learning-python.com/thumbspage/UserGuide.html#scaling16
herehttps://learning-python.com/thumbspage/UserGuide.html#_dn9
scrolled scalinghttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-old-1t.PNG
herehttps://learning-python.com/thumbspage/UserGuide.html#destacking16
herehttps://gs.statcounter.com/browser-market-share
toolbarshttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-new-1t.png
Chromehttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-scaled-landscape-ch.png
Firefoxhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-scaled-landscape-ff.png
Edgehttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-scaled-landscape-eg.png
UC Browserhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-scaled-landscape-uc.png
Androidhttps://learning-python.com/thumbspage/examples/Screenshots/scaling-android-landscape.png
windowhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hide-toolbars.PNG
web searchhttps://duckduckgo.com/?&q=safari+ios+13+hide+toolbar
like thishttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hid-landscape.PNG
displayhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hid-portrait.PNG
brokenhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-portrait-safari.png
widgetshttps://duckduckgo.com/?q=ioS+Safari+toolbar+double+taps+hide+toolbar
hosthttps://learning-python.com/about-this-site.html#safariios13toolbars
tophttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-new-1t.png
bottomhttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-new-2b.png
down-scroll)https://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-old-2b.PNG
disabledhttps://learning-python.com/thumbspage/examples/Screenshots/scaling-nojavascript-warn.png
displayshttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-old-1t.PNG
filehttps://learning-python.com/thumbspage/user_configs.py
defecthttps://learning-python.com/edge41-hover-left.png
pagehttps://learning-python.com/edge-links-bug.html
duethttps://learning-python.com/about-this-site.html#chromeduet
displayhttps://learning-python.com/android-chrome-duet-lp5e-land.jpg
agendashttps://duckduckgo.com/?q=android+chrome+duet
piexifhttps://learning-python.com/thumbspage/UserGuide.html#Installs and Platforms
earlierhttps://learning-python.com/thumbspage/UserGuide.html#rotateskeepexifs
piexifhttps://pypi.org/project/piexif/
Pillowhttps://pypi.python.org/pypi/Pillow
GitHubhttps://github.com/hMatoba/Piexif/issues/95
standardhttps://www.exif.org/Exif2-2.PDF
tagpixhttps://learning-python.com/tagpix.html
reporthttps://github.com/hMatoba/Piexif/issues/83
viewer_thumbs.pyhttps://learning-python.com/thumbspage/viewer_thumbs.py
worsehttps://learning-python.com/thumbspage/UserGuide.html#rotateskeepexifs
1.6 notehttps://learning-python.com/thumbspage/UserGuide.html#rotation16
GUI viewerhttps://learning-python.com/thumbspage/UserGuide.html#GUI Mode
version 1.7https://learning-python.com/thumbspage/UserGuide.html#android
JavaScripthttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
imageshttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-desktop.png
Chromehttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-view-desktop1.png
Firefoxhttps://learning-python.com/thumbspage/examples/Screenshots/unicode-images-view1-firefox.png
Windowshttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-x-windows-view.png
Linuxhttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-x-linux-view.png
Chromehttps://learning-python.com/thumbspage/examples/Screenshots/scaling-android-portrait.png
Safarihttps://learning-python.com/thumbspage/examples/Screenshots/scaling-ios-portrait.jpeg
spacehttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-view-mobile2.png
modehttps://learning-python.com/thumbspage/examples/Screenshots/scaling-ios-landscape.jpeg
imageshttps://learning-python.com/thumbspage/examples/Screenshots/scaling-android-landscape.png
solvehttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios13-safari-hid-landscape.PNG
problemshttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios11-safari-landscape-new-2b.png
Androidhttps://learning-python.com/thumbspage/examples/1.7-upgrades/image-larger-mobile-1.7.jpg
iOShttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-scaled-landscape-ch.png
herehttps://learning-python.com/thumbspage/UserGuide.html#iosscale17
messagehttps://learning-python.com/thumbspage/examples/Screenshots/scaling-loading-1.png
indicatorhttps://learning-python.com/thumbspage/examples/Screenshots/scaling-loading-mobile-1.png
notehttps://learning-python.com/thumbspage/examples/Screenshots/scaling-nojavascript-warn.png
resultshttps://learning-python.com/thumbspage/examples/Screenshots/scaling-nojavascript-mobile.png
the codehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
tiltedhttps://learning-python.com/thumbspage/examples/Screenshots/reorient-prior-index.png
right-sidehttps://learning-python.com/thumbspage/examples/Screenshots/reorient-new-index.png
tagshttps://en.wikipedia.org/wiki/Exif
standardhttps://www.exif.org/Exif2-2.PDF
websitehttp://learning-python.com/pygadgets.html
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
examples/reorientationhttps://learning-python.com/thumbspage/examples/reorientation
restore-prerotate-originals.pyhttps://learning-python.com/thumbspage/docetc/restore-prerotate-originals.py
viewer_thumbs.pyhttps://learning-python.com/thumbspage/viewer_thumbs.py
detailshttps://learning-python.com/thumbspage/UserGuide.html#rotateskeepexifs
dialogshttps://learning-python.com/thumbspage/examples/1.7-upgrades/info-dialog-chrome-desktop.png
this 1.7 notehttps://learning-python.com/thumbspage/UserGuide.html#piexifworkaround
notehttps://learning-python.com/thumbspage/UserGuide.html#tpsansrotates
demohttps://learning-python.com/thumbspage/examples/reorientation/Unrotated-images-in-browsers/index.html
notehttps://learning-python.com/thumbspage/UserGuide.html#21rotations
Customizationhttps://learning-python.com/thumbspage/UserGuide.html#Customization
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
notehttps://learning-python.com/thumbspage/UserGuide.html#floatingtop20
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
template filehttps://learning-python.com/cgi/showcode.py?name=thumbspage/template-viewpage.html
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
this pagehttp://learning-python.com/site-traffic-half1-2018.txt
2.0 notehttps://learning-python.com/thumbspage/UserGuide.html#_205
viewer_thumbs.pyhttps://learning-python.com/thumbspage/viewer_thumbs.py
this sitehttps://developer.mozilla.org/en-US/docs/Web/CSS/border-width
aheadhttps://learning-python.com/thumbspage/UserGuide.html#chromehrfix15
noteshttps://learning-python.com/thumbspage/UserGuide.html#1.6
viewer pagehttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-view-desktop1.png
displayhttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-view-desktop4-raw.png
clickshttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-index-desktop.png
thumbs folderhttps://learning-python.com/thumbspage/examples/Screenshots/_thumbspage
this sitehttp://learning-python.com/trnpix/
CSS alonehttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-x-ios-mobile4-landscape.jpeg
abovehttps://learning-python.com/thumbspage/UserGuide.html#scaling16
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
thumbspage.pyhttps://learning-python.com/thumbspage/thumbspage.py
thumbspage.pyhttps://learning-python.com/thumbspage/thumbspage.py
filehttps://learning-python.com/thumbspage/UserGuide.html#Customization
configurationhttps://learning-python.com/thumbspage/user_configs.py
bordershttps://learning-python.com/thumbspage/UserGuide.html#imgborderfix16
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
HEADER.htmlhttps://learning-python.com/thumbspage/UserGuide.html#Customization
smaller screenshttps://learning-python.com/thumbspage/examples/Screenshots/trnpix-index-mobile.png
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
HEADER.htmlhttps://learning-python.com/thumbspage/UserGuide.html#Customization
live demohttps://learning-python.com/thumbspage/examples/unicode/images/index.html
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
examples/unicode/imageshttps://learning-python.com/thumbspage/examples/unicode/images
filehttps://learning-python.com/thumbspage/UserGuide.html#Customization
byte valueshttps://learning-python.com/thumbspage/UserGuide.html#urlescape15
templateEncodinghttps://learning-python.com/thumbspage/UserGuide.html#templateencoding16
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
fixhttps://learning-python.com/thumbspage/UserGuide.html#chromehrfix15
auto-scrollshttps://learning-python.com/thumbspage/UserGuide.html#1.4
subfolder-links listhttps://learning-python.com/thumbspage/examples/subfolders/index.html
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
filehttps://learning-python.com/thumbspage/UserGuide.html#Customization
subfolderhttps://learning-python.com/thumbspage/examples/mixedtypes/index.html
machinehttps://duckduckgo.com/?q=run+web+server+locally
configshttps://learning-python.com/thumbspage/user_configs.py
release note. https://learning-python.com/thumbspage/UserGuide.html#other21
pagehttps://learning-python.com/thumbspage/examples/__prior-version-items/__prior-screenshots/older/trnpix-1.1.png
resultshttps://learning-python.com/thumbspage/examples/__prior-version-items/__prior-screenshots/older/frigcal-thumbs-1.1.png
pageshttps://learning-python.com/thumbspage/examples/__prior-version-items/__prior-screenshots/older/frigcal-before-1.1.png
releaseshttps://learning-python.com/thumbspage/examples/2.1-upgrades/index.html
code fileshttps://learning-python.com/thumbspage/
Version Historyhttps://learning-python.com/thumbspage/UserGuide.html#Version History
Info popups display a subset of Exif tags Embedded thumbnails are ignored Image types are not universally supported Rotations drop Exif tags (closed) Android Chrome scrollbar oddment Extra-files overhead Parent-folder links Index-file location Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnI
Embedded thumbnails are ignored Image types are not universally supported Rotations drop Exif tags (closed) Android Chrome scrollbar oddment Extra-files overhead Parent-folder links Index-file location Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnK
Image types are not universally supported Rotations drop Exif tags (closed) Android Chrome scrollbar oddment Extra-files overhead Parent-folder links Index-file location Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn1
Rotations drop Exif tags (closed) Android Chrome scrollbar oddment Extra-files overhead Parent-folder links Index-file location Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn2
Android Chrome scrollbar oddment Extra-files overhead Parent-folder links Index-file location Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn3
Extra-files overhead Parent-folder links Index-file location Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn4
Parent-folder links Index-file location Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn5
Index-file location Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn6
Meta tags for custom headers More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn7
More code clean up Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn8
Mobile landscape scaling (closed) Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dn9
Chrome history destacking bug (closed) More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnA
More user customizations Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnB
Dynamic index-page columns Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnC
Image information display (closed) Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnD
Browser fullscreen-mode options (closed) Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnG
Automatic slideshows (closed) A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnH
A floating "Top" for index pages (closed) Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnE
Can reorientation be dropped? (closed) Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnL
Per-image notes? How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnM
How about a GUI? https://learning-python.com/thumbspage/UserGuide.html#_dnF
info popupshttps://learning-python.com/thumbspage/examples/2.0-upgrades/xtra-mobile-android6inch-info.jpg
earlierhttps://learning-python.com/thumbspage/UserGuide.html#_207
data itemshttps://www.exiv2.org/tags.html
Exif standardhttps://www.exif.org/Exif2-2.PDF
rotateshttps://learning-python.com/thumbspage/UserGuide.html#rotation16
notehttps://learning-python.com/thumbspage/UserGuide.html#21rotations
earlierhttps://learning-python.com/thumbspage/UserGuide.html#tiffs
searchhttps://duckduckgo.com/?q=display+tiff+in+web+browser
earlierhttps://learning-python.com/thumbspage/UserGuide.html#rotation16
tagshttps://en.wikipedia.org/wiki/Exif
detailshttps://learning-python.com/thumbspage/UserGuide.html#rotateskeepexifs
dialogshttps://learning-python.com/thumbspage/examples/1.7-upgrades/info-dialog-chrome-desktop.png
earlierhttps://learning-python.com/thumbspage/UserGuide.html#chromescroll16
earlierhttps://learning-python.com/thumbspage/UserGuide.html#extrafiles
PyPhotohttps://learning-python.com/pygadgets.html
schemehttps://learning-python.com/cgi/showcode.py?name=pygadgets-products/unzipped/_PyPhoto/PIL/viewer_thumbs.py
listshttps://learning-python.com/thumbspage/UserGuide.html#1.1
trnpixhttps://learning-python.com/thumbspage/examples/trnpix
custom headershttps://learning-python.com/thumbspage/UserGuide.html#Customization
1.5https://learning-python.com/thumbspage/UserGuide.html#1.5
images scalinghttps://learning-python.com/thumbspage/UserGuide.html#scaling16
scrollablehttps://learning-python.com/thumbspage/examples/Screenshots/scaling-ios-landscape.jpeg
shrunkenhttps://learning-python.com/thumbspage/examples/Screenshots/scaling-android-landscape.png
herehttps://learning-python.com/thumbspage/UserGuide.html#_174
Androidhttps://learning-python.com/thumbspage/examples/1.7-upgrades/image-larger-mobile-1.7.jpg
iOShttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-scaled-landscape-ch.png
herehttps://learning-python.com/thumbspage/UserGuide.html#iosscale17
abovehttps://learning-python.com/thumbspage/UserGuide.html#destacking16
configurationhttps://learning-python.com/thumbspage/user_configs.py
abovehttps://learning-python.com/thumbspage/UserGuide.html#destacking16
2.0https://learning-python.com/thumbspage/UserGuide.html#_205
earlierhttps://learning-python.com/thumbspage/UserGuide.html#Customization
user_configs.pyhttps://learning-python.com/thumbspage/user_configs.py
notehttps://learning-python.com/thumbspage/UserGuide.html#dynamiclayout21
dialoghttps://learning-python.com/thumbspage/UserGuide.html#filenametap
release notehttps://learning-python.com/thumbspage/UserGuide.html#infocustom20
fullscreen displayhttps://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API
browsershttps://learning-python.com/thumbspage/UserGuide.html#fullscreenmanual
disabledhttps://learning-python.com/thumbspage/user_configs.py
notehttps://learning-python.com/thumbspage/UserGuide.html#fullscreen20
availablehttps://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API
mobilehttps://learning-python.com/thumbspage/examples/1.7-upgrades/ios-portrait-safari.png
herehttps://learning-python.com/thumbspage/UserGuide.html#slideshow20
herehttps://learning-python.com/thumbspage/UserGuide.html#_vt1
abovehttps://learning-python.com/thumbspage/UserGuide.html#_20C
storyhttps://learning-python.com/thumbspage/UserGuide.html#moresafarijunk
tables of linkshttp://learning-python.com/trnpix/index.html
filehttps://learning-python.com/thumbspage/user_configs.py
notehttps://learning-python.com/thumbspage/UserGuide.html#floatingtop20
2.0 notehttps://learning-python.com/thumbspage/UserGuide.html#tpsansrotates
notehttps://learning-python.com/thumbspage/UserGuide.html#tpsansrotates
herehttps://learning-python.com/thumbspage/UserGuide.html#notes23
promptshttps://learning-python.com/thumbspage/UserGuide.html#Running thumbspage
modulehttps://learning-python.com/thumbspage/user_configs.py
insertshttps://learning-python.com/thumbspage/UserGuide.html#Customization
thinkhttp://learning-python.com/programs.html#complete
docetc/more-docs-trimmedhttps://learning-python.com/thumbspage/docetc/more-docs-trimmed.txt
web pagehttp://learning-python.com/thumbspage.html#Resources
tagpixhttp://learning-python.com/tagpix.html
PyPhotohttp://learning-python.com/pygadgets.html
learning-python.comhttp://learning-python.com/programs.html
uphttps://learning-python.com/thumbspage/examples/reorientation/_thumbspage/galaxys8-3U.jpg.html
http://learning-python.com/index.html
Tophttps://learning-python.com/thumbspage/UserGuide.html
Codehttp://learning-python.com/thumbspage/
Pagehttp://learning-python.com/thumbspage.html
Demohttp://learning-python.com/thumbspage.html#demos
Newshttp://learning-python.com/post-release-updates.html
Bloghttp://learning-python.com/posts.html
Appshttp://learning-python.com/programs.html

Viewport: width=device-width, initial-scale=1.0


URLs of crawlers that visited me.