Add gaussian blurs behind photos #34

Merged
Aaron merged 7 commits from image-blur into master 2023-11-11 12:05:01 +01:00
4 changed files with 118 additions and 38 deletions

View File

@ -199,33 +199,57 @@ i.space-invader.alt-7::before {
div.polaroid {
background: #fff;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.3);
line-height: 0;
position: relative;
transition: 0.25s;
}
div.polaroid img {
background: url('../images/nothumb.svg') center no-repeat;
div.polaroid:hover {
box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.5);
}
div.polaroid img.normal-photo {
background: #fff url('../images/nothumb.svg') center no-repeat;
border: none;
left: 0;
object-fit: cover;
position: absolute;
top: 0;
width: 100%;
z-index: 20;
}
div.polaroid img.blur-photo {
filter: blur(50px);
left: 0;
object-fit: cover;
position: absolute;
top: 0;
width: 100%;
z-index: 0;
}
div.polaroid img.placeholder-image {
background: #fff;
z-index: 20;
}
div.polaroid h4 {
background: #fff;
bottom: 0;
color: #000;
margin: 0;
font: 400 18px 'Coda', sans-serif;
padding: 15px 5px;
position: absolute;
text-overflow: ellipsis;
text-align: center;
width: 100%;
white-space: nowrap;
overflow: hidden;
z-index: 20;
}
div.polaroid a {
display: block;
text-decoration: none;
}
div.polaroid:hover {
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
/* Album title boxes
@ -366,22 +390,53 @@ footer a {
/* Styling for the photo pages
--------------------------------*/
#photo_frame {
padding-top: 1.5vh;
text-align: center;
}
#photo_frame a {
#photo_frame {
padding: 3.5vh 0;
text-align: center;
height: 95vh;
}
#photo_frame a img {
border: none;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
cursor: -moz-zoom-in;
display: inline-block;
height: 97vh;
max-width: 100%;
#photo-figure {
position: relative;
object-fit: contain;
width: auto;
height: 93vh;
object-position: center center;
}
#photo-figure img {
object-position: center center;
}
#photo-figure img.normal-photo {
border: none;
cursor: -moz-zoom-in;
object-fit: contain;
z-index: 20;
position: absolute;
left: 0;
top: 0;
}
#photo-figure img.blur-photo {
filter: blur(50px);
left: 0;
object-fit: contain;
position: absolute;
top: 0;
z-index: 0;
}
figure.portrait-figure,
figure.landscape-figure {
height: 93vh;
margin: 0 auto;
}
figure.panorama-figure {
object-fit: cover;
margin: 0 auto;
}
figure#photo-figure img.normal-photo,
figure#photo-figure img.blur-photo {
height: 100%;
width: 100%;
}
#previous_photo, #next_photo {

View File

@ -42,7 +42,7 @@ class AlbumIndex extends Template
{
echo '
<div class="col-md-6 col-xl-4">
<div class="polaroid landscape">';
<div class="polaroid landscape" style="aspect-ratio: 1.12">';
if ($this->show_edit_buttons)
echo '
@ -58,15 +58,20 @@ class AlbumIndex extends Template
$thumbs[$factor] = $album['thumbnail']->getThumbnailUrl(
static::TILE_WIDTH * $factor, static::TILE_HEIGHT * $factor, true, true);
foreach (['normal-photo', 'blur-photo'] as $className)
{
echo '
<img alt="" src="', $thumbs[1], '"' . (isset($thumbs[2]) ?
' srcset="' . $thumbs[2] . ' 2x"' : '') .
' class="', $className, '"' .
' alt="" style="aspect-ratio: ', self::TILE_RATIO, '">';
}
}
else
{
echo '
<img alt="" src="', BASEURL, '/images/nothumb.svg"',
' class="placeholder-image"',
' style="aspect-ratio: ', self::TILE_RATIO, '; object-fit: unset">';
}

View File

@ -67,17 +67,31 @@ class PhotoPage extends Template
protected function photo()
{
echo '
<div id="photo_frame">
<a href="', $this->photo->getUrl(), '">';
<a href="', $this->photo->getUrl(), '">
<div id="photo_frame">';
if ($this->photo->isPortrait())
echo $this->photo->getInlineImage(null, 960);
{
echo '
<figure id="photo-figure" class="portrait-figure">',
$this->photo->getInlineImage(null, 960, 'normal-photo'),
$this->photo->getInlineImage(null, 960, 'blur-photo'), '
</figure>';
}
else
echo $this->photo->getInlineImage(1280, null);
{
$className = $this->photo->isPanorama() ? 'panorama-figure' : 'landscape-figure';
echo '
<figure id="photo-figure" class="', $className, '">',
$this->photo->getInlineImage(1280, null, 'normal-photo'),
$this->photo->getInlineImage(1280, null, 'blur-photo'), '
</figure>';
}
echo '
</a>
</div>';
</figure>
</div>
</a>';
}
private function photoNav()

View File

@ -83,15 +83,23 @@ class PhotosIndex extends Template
protected function photo(Image $image, $className, $width, $height, $crop = true, $fit = true)
{
// Prefer thumbnail aspect ratio if available, otherwise use image aspect ratio.
$aspectRatio = isset($width, $height) ? $width / $height : $image->ratio();
echo '
<div class="polaroid ', $className, '">';
<div class="polaroid ', $className, '" style="aspect-ratio: ', $aspectRatio, '">';
if ($this->show_edit_buttons)
echo '
<a class="edit" href="', BASEURL, '/editasset/?id=', $image->getId(), '">Edit</a>';
echo '
<a href="', $image->getPageUrl(), $this->url_suffix, '#photo_frame">
<a href="', $image->getPageUrl(), $this->url_suffix, '#photo_frame">';
foreach (['normal-photo', 'blur-photo'] as $className)
{
echo '
<img src="', $image->getThumbnailUrl($width, $height, $crop, $fit), '"';
// Can we offer double-density thumbs?
@ -100,10 +108,8 @@ class PhotosIndex extends Template
else
echo ' srcset="', $image->getThumbnailUrl($image->width(), $image->height(), true), ' 2x"';
// Prefer thumbnail aspect ratio if available, otherwise use image aspect ratio.
$aspectRatio = isset($width, $height) ? $width / $height : $image->ratio();
echo ' alt="" title="', $image->getTitle(), '" style="aspect-ratio: ', $aspectRatio, '">';
echo ' alt="" title="', $image->getTitle(), '" class="', $className, '" style="aspect-ratio: ', $aspectRatio, '">';
}
if ($this->show_labels)
echo '