2022-02-20 15:15:38 +01:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< meta http-equiv = "X-UA-Compatible" content = "ie=edge" >
2022-12-17 10:12:40 +01:00
< link rel = "stylesheet" href = "../../../static/styles.css?h=dff0aaad" >
2022-02-20 15:15:38 +01:00
< link rel = "stylesheet" href = "../../../static/pygments.css" >
< link rel = "shortcut icon" href = "../../../static/favicon.png?h=fa09bedd" >
< title > Image Operations | Documentation | Lektor Static Content Management System< / title >
< / head >
< body class = "default" >
< nav class = "navbar navbar-inverse navbar-static-top" >
< div class = "container" >
< div class = "navbar-header" >
< button type = "button" class = "navbar-toggle collapsed"
data-toggle="collapse" data-target="#navbar"
aria-expanded="false" aria-controls="navbar">
< span class = "sr-only" > Toggle navigation< / span >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< span class = "icon-bar" > < / span >
< / button >
< a class = "navbar-brand" href = "../../../" > Lektor< / a >
< / div >
< div id = "navbar" class = "collapse navbar-collapse" >
< ul class = "nav navbar-nav" >
< li > < a href = "../../../downloads/" > Download< / a > < / li >
< li class = "active" > < a href = "../../" > Documentation< / a > < / li >
< li > < a href = "../../../showcase/" > Showcase< / a > < / li >
< li > < a href = "../../../plugins/" > Plugins< / a > < / li >
< li > < a href = "../../../community/" > Community< / a > < / li >
< li > < a href = "../../../blog/" > Blog< / a > < / li >
< / ul >
< / div >
< / div >
< / nav >
< div class = "body-wrapper" >
< div class = "container" >
< div class = "row" >
< div class = "col-sm-3" >
< ul class = "tree-nav nocontent" >
< li > < a href = "../../" > Welcome< / a > < / li >
< li > < a href = "../../what/" > What is Lektor< / a >
< li > < a href = "../../installation/" > Installation< / a >
< li > < a href = "../../quickstart/" > Quickstart< / a >
< li > < a href = "../../project/" > Project< / a >
< li > < a href = "../../content/" > Content< / a >
< li > < a href = "../" > Templates< / a >
< ul >
< li > < a href = "../urls/" > URLs and Links< / a >
< li > < a href = "../navigation/" > Navigation< / a >
< li class = "active" > < a href = "./" > Image Operations< / a >
< ul > < / ul >
< li > < a href = "../videoops/" > Video Operations< / a >
< / ul >
< li > < a href = "../../themes/" > Themes< / a >
< li > < a href = "../../guides/" > Guides< / a >
< li > < a href = "../../deployment/" > Deployment< / a >
< li > < a href = "../../plugins/" > Plugins< / a >
< li > < a href = "../../models/" > Data Modelling< / a >
< li > < a href = "../../cli/" > Command Line< / a >
< li > < a href = "../../api/" > API< / a >
< li > < a href = "../../search/" > Search< / a >
< / ul >
< div class = "visible-md-block visible-lg-block" >
< h4 > This Page< / h4 >
< ul class = "toc" >
< li > < a href = "#accessing-images" > Accessing Images< / a > < / li >
< li > < a href = "#accessing-image-data" > Accessing Image Data< / a > < / li >
< li > < a href = "#accessing-exif-data" > Accessing EXIF Data< / a > < / li >
< li > < a href = "#generating-thumbnails" > Generating Thumbnails< / a > < / li >
< / ul >
< / div >
< / div >
< div class = "col-sm-9 doc-styling" >
< h1 > Image Operations< / h1 >
< ul class = page-meta >
< / ul >
< p > Images are separate files and as such just embedded into HTML files. However
very often you want to perform modifications on these images that require
interacting with those files directly. This can be conveniently done directly
from the template code through the image APIs that Lektor provides.< / p >
< h2 id = "accessing-images" > Accessing Images< / h2 > < p > To work with images one needs to get access to the image objects first. Images
are returned from the attachments of a page. If you want to make sure you
only operate with actual images the < code > .images< / code > attribute can be used to filter
the query. For instance this iterates over all attached images of a page:< / p >
2022-05-03 00:53:59 +02:00
< div class = "hll" > < pre > < span > < / span > < span class = "cp" > {%< / span > < span class = "k" > for< / span > < span class = "nv" > image< / span > < span class = "k" > in< / span > < span class = "nv" > this.attachments.images< / span > < span class = "cp" > %}< / span >
2022-02-20 15:15:38 +01:00
< span class = "p" > < < / span > < span class = "nt" > div< / span > < span class = "na" > class< / span > < span class = "o" > =< / span > < span class = "s" > " image" < / span > < span class = "p" > > < < / span > < span class = "nt" > img< / span > < span class = "na" > src< / span > < span class = "o" > =< / span > < span class = "s" > " < / span > < span class = "cp" > {{< / span > < span class = "nv" > image< / span > < span class = "o" > |< / span > < span class = "nf" > url< / span > < span class = "cp" > }}< / span > < span class = "s" > " < / span > < span class = "p" > > < /< / span > < span class = "nt" > div< / span > < span class = "p" > > < / span >
< span class = "cp" > {%< / span > < span class = "k" > endfor< / span > < span class = "cp" > %}< / span >
< / pre > < / div >
< p > < br / >
To access images from a different content folder, you would use:< / p >
2022-05-03 00:53:59 +02:00
< div class = "hll" > < pre > < span > < / span > < span class = "cp" > {%< / span > < span class = "k" > for< / span > < span class = "nv" > image< / span > < span class = "k" > in< / span > < span class = "nv" > site.get< / span > < span class = "o" > (< / span > < span class = "s1" > ' /myfolder' < / span > < span class = "o" > )< / span > < span class = "nv" > .attachments.images< / span > < span class = "cp" > %}< / span >
2022-02-20 15:15:38 +01:00
< span class = "p" > < < / span > < span class = "nt" > div< / span > < span class = "na" > class< / span > < span class = "o" > =< / span > < span class = "s" > " image" < / span > < span class = "p" > > < < / span > < span class = "nt" > img< / span > < span class = "na" > src< / span > < span class = "o" > =< / span > < span class = "s" > " < / span > < span class = "cp" > {{< / span > < span class = "nv" > image< / span > < span class = "o" > |< / span > < span class = "nf" > url< / span > < span class = "cp" > }}< / span > < span class = "s" > " < / span > < span class = "p" > > < /< / span > < span class = "nt" > div< / span > < span class = "p" > > < / span >
< span class = "cp" > {%< / span > < span class = "k" > endfor< / span > < span class = "cp" > %}< / span >
< / pre > < / div >
< p > < br / >
To retrieve only a specific image or attachment with a certain name you would use< / p >
2022-05-03 00:53:59 +02:00
< div class = "hll" > < pre > < span > < / span > < span class = "cp" > {%< / span > < span class = "k" > set< / span > < span class = "nv" > my_image< / span > < span class = "o" > =< / span > < span class = "nv" > site.get< / span > < span class = "o" > (< / span > < span class = "s1" > ' /myfolder' < / span > < span class = "o" > )< / span > < span class = "nv" > .attachments.get< / span > < span class = "o" > (< / span > < span class = "s1" > ' imagenameexample.jpg' < / span > < span class = "o" > )< / span > < span class = "cp" > %}< / span >
2022-02-20 15:15:38 +01:00
< span class = "p" > < < / span > < span class = "nt" > div< / span > < span class = "na" > class< / span > < span class = "o" > =< / span > < span class = "s" > " image" < / span > < span class = "p" > > < < / span > < span class = "nt" > img< / span > < span class = "na" > src< / span > < span class = "o" > =< / span > < span class = "s" > " < / span > < span class = "cp" > {{< / span > < span class = "nv" > my_image< / span > < span class = "o" > |< / span > < span class = "nf" > url< / span > < span class = "cp" > }}< / span > < span class = "s" > " < / span > < span class = "p" > > < /< / span > < span class = "nt" > div< / span > < span class = "p" > > < / span >
< / pre > < / div >
< h2 id = "accessing-image-data" > Accessing Image Data< / h2 > < p > One of the more common operations is to access the direct image data. This
is resolution and file format. The < code > width< / code > , < code > height< / code > and < code > format< / code > parameters
are provided for this. In some cases this is very useful to generate CSS code
that needs to know about the original resolution. For instance this achieves a
retina rendered background:< / p >
2022-05-03 00:53:59 +02:00
< div class = "hll" > < pre > < span > < / span > < span class = "p" > < < / span > < span class = "nt" > div< / span > < span class = "na" > style< / span > < span class = "o" > =< / span > < span class = "s" > " < / span >
2022-02-20 15:15:38 +01:00
< span class = "s" > background: url(< / span > < span class = "cp" > {{< / span > < span class = "nv" > image< / span > < span class = "o" > |< / span > < span class = "nf" > url< / span > < span class = "cp" > }}< / span > < span class = "s" > );< / span >
< span class = "s" > background-size: < / span > < span class = "cp" > {{< / span > < span class = "nv" > image.width< / span > < span class = "o" > /< / span > < span class = "m" > 2< / span > < span class = "cp" > }}< / span > < span class = "s" > px < / span > < span class = "cp" > {{< / span > < span class = "nv" > image.height< / span > < span class = "o" > /< / span > < span class = "m" > 2< / span > < span class = "cp" > }}< / span > < span class = "s" > px< / span >
< span class = "s" > " < / span > < span class = "p" > > < /< / span > < span class = "nt" > div< / span > < span class = "p" > > < / span >
< / pre > < / div >
< h2 id = "accessing-exif-data" > Accessing EXIF Data< / h2 > < p > Lektor can also give you access to a lot of the EXIF information that is stored
in the images. Not all EXIF information is available but the most common
values are. For the full list of attributes see < a href = "../../api/db/record/exif/" class = "ref" > EXIF data< / a > .< / p >
< p > Here an example that shows the camera information:< / p >
2022-05-03 00:53:59 +02:00
< div class = "hll" > < pre > < span > < / span > < span class = "p" > < < / span > < span class = "nt" > div< / span > < span class = "na" > class< / span > < span class = "o" > =< / span > < span class = "s" > " image" < / span > < span class = "p" > > < / span >
2022-02-20 15:15:38 +01:00
< span class = "p" > < < / span > < span class = "nt" > img< / span > < span class = "na" > src< / span > < span class = "o" > =< / span > < span class = "s" > " < / span > < span class = "cp" > {{< / span > < span class = "nv" > image< / span > < span class = "o" > |< / span > < span class = "nf" > url< / span > < span class = "cp" > }}< / span > < span class = "s" > " < / span > < span class = "na" > alt< / span > < span class = "o" > =< / span > < span class = "s" > " " < / span > < span class = "p" > > < / span >
< span class = "p" > < < / span > < span class = "nt" > p< / span > < span class = "p" > > < < / span > < span class = "nt" > strong< / span > < span class = "p" > > < / span > Camera:< span class = "p" > < /< / span > < span class = "nt" > strong< / span > < span class = "p" > > < / span > < span class = "cp" > {{< / span > < span class = "nv" > image.exif.camera< / span > < span class = "cp" > }}< / span >
< span class = "p" > < /< / span > < span class = "nt" > div< / span > < span class = "p" > > < / span >
< / pre > < / div >
< h2 id = "generating-thumbnails" > Generating Thumbnails< / h2 > < p > While browsers are reasonably good at downscaling images themselves, you
still need to transmit the entire image. When you want smaller images it
often makes sense to generate thumbnails automatically. In Lektor each
image provides the < a href = "../../api/db/record/thumbnail/" class = "ref" > thumbnail< / a > method.< / p >
< p > It accepts the width and height of the target image. If either of these is not
provided, it will be computed automatically. The return value can be converted
into a URL with the < code > |url< / code > filter:< / p >
2022-05-03 00:53:59 +02:00
< div class = "hll" > < pre > < span > < / span > < span class = "p" > < < / span > < span class = "nt" > img< / span > < span class = "na" > src< / span > < span class = "o" > =< / span > < span class = "s" > " < / span > < span class = "cp" > {{< / span > < span class = "nv" > image.thumbnail< / span > < span class = "o" > (< / span > < span class = "m" > 320< / span > < span class = "o" > )|< / span > < span class = "nf" > url< / span > < span class = "cp" > }}< / span > < span class = "s" > " < / span > < span class = "p" > > < / span >
2022-02-20 15:15:38 +01:00
< / pre > < / div >
< div class = "comment-box" >
< h2 > Comments< / h2 >
< div id = "disqus_thread" > < / div >
< script >
var disqus_config = function() { this.page.identifier = "/docs/templates/imageops"; this.page.url = "https://www.getlektor.com/docs/templates/imageops/"; };
(function() {
var d = document, s = d.createElement('script');
s.src = '//lektordocumentation.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
< / script >
< noscript >
Please enable JavaScript to view the < a href = "https://disqus.com/?ref_noscript"
rel="nofollow">comments powered by Disqus.< / a >
< / noscript >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "bottomsummary" >
< div class = "container" >
< / div >
< / div >
< footer >
< div class = "container" >
< div class = "row" >
< div class = "col-sm-4 icon-bar" >
< a href = "https://github.com/lektor/lektor/" title = "Lektor on GitHub"
>< i class = "fa fa-github" > < / i > < / a >
< a href = "https://github.com/lektor/lektor/issues/" title = "Report Issues for Lektor"
>< i class = "fa fa-bug" > < / i > < / a >
< a href = "https://twitter.com/getlektor" title = "Find Lektor on Twitter"
>< i class = "fa fa-twitter" > < / i > < / a >
< a href = "https://gitter.im/lektor/lektor" title = "Chat on Gitter"
>< i class = "fa fa-comment" > < / i > < / a >
< a href = "https://github.com/lektor/lektor-website/tree/master/content/docs/templates/imageops/contents.lr" title = "View source for this page" > < i class = "fa fa-code" > < / i > < / a >
< / div >
< div class = "col-sm-8" >
< a href = "../../../license/" > License & Copyright< / a > •
< a href = "../../../contact/" > Contact< / a > •
Made with < i class = "fa fa-fw fa-heart" title = "Heart" > < span hidden > Heart< / span > < / i > in Carinthia
< / div >
< / div >
< / div >
< / footer >
2023-07-19 20:30:41 +02:00
< script type = text/javascript src = "../../../static/app.js?h=8b801996" charset = "utf-8" > < / script >
2022-02-20 15:15:38 +01:00
< script >
((window.gitter = {}).chat = {}).options = {
room: 'lektor/lektor',
activationElement: null
};
document.write('< button class = "js-gitter-toggle-chat-button" > Toggle Chat< / button > ');
var dnt = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
if (dnt != "1" & & dnt != "yes") {
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
ga('create', 'UA-70822533-1', 'auto');
ga('set', 'anonymizeIp', true);
ga('send', 'pageview');
} else {
console.debug("Respecting Do-Not-Track, not running analytics.");
}
< / script >
< script async src = 'https://www.google-analytics.com/analytics.js' > < / script >
< script async defer id = "github-bjs" src = "https://buttons.github.io/buttons.js" > < / script >
< script > ! function ( d , s , id ) { var js , fjs = d . getElementsByTagName ( s ) [ 0 ] , p = /^http:/ . test ( d . location ) ? 'http' : 'https' ; if ( ! d . getElementById ( id ) ) { js = d . createElement ( s ) ; js . id = id ; js . src = p + '://platform.twitter.com/widgets.js' ; fjs . parentNode . insertBefore ( js , fjs ) ; } } ( document , 'script' , 'twitter-wjs' ) ; < / script >
< script src = "https://sidecar.gitter.im/dist/sidecar.v1.js" async defer > < / script >
< / body >
< / html >