From: Baptiste CLÉMENT Date: Sat, 17 Aug 2013 14:27:34 +0000 (+0200) Subject: New plugin for balanced height thumbnails X-Git-Tag: v1.7~12 X-Git-Url: http://positon.org/gitweb/?p=bizou.git;a=commitdiff_plain;h=50a41f61ada67eacb3e1557006af2b935b67fa60 New plugin for balanced height thumbnails --- diff --git a/plugins/balanced/before_content.php b/plugins/balanced/before_content.php new file mode 100644 index 0000000..63cbb11 --- /dev/null +++ b/plugins/balanced/before_content.php @@ -0,0 +1 @@ + diff --git a/plugins/balanced/functions.php b/plugins/balanced/functions.php new file mode 100644 index 0000000..9464423 --- /dev/null +++ b/plugins/balanced/functions.php @@ -0,0 +1,64 @@ + $h) { + // $newW = $maxSize; + // $newH = $h/($w/$maxSize); + //} else { + $newW = $w/($h/$maxSize); + $newH = $maxSize; + //} + + $newImg = imagecreatetruecolor($newW, $newH); + + imagecopyresampled($newImg, $img, 0, 0, 0, 0, $newW, $newH, $w, $h); + + if ($ext == ".jpg") + imagejpeg($newImg, $newImgFile); + else + imagepng($newImg, $newImgFile); + + imagedestroy($img); + imagedestroy($newImg); + } + + return $newImgFile; +} + + +?> diff --git a/plugins/balanced/head.php b/plugins/balanced/head.php new file mode 100644 index 0000000..44cca72 --- /dev/null +++ b/plugins/balanced/head.php @@ -0,0 +1,9 @@ + + diff --git a/plugins/balanced/scripts.js b/plugins/balanced/scripts.js new file mode 100644 index 0000000..51eb4c6 --- /dev/null +++ b/plugins/balanced/scripts.js @@ -0,0 +1,129 @@ +function applyOptimalImagesSize() +{ + var divimages = document.getElementsByClassName("image"); + var images = new Array(); + for(var i = 0 ; i < divimages.length ; ++i) + { + images.push(divimages[i].children[0].children[0]); + } + var bestHeight = parseInt(document.getElementById("thumbsize").textContent); + var newHList = getOptimalHeights(images, bestHeight); + for( var i = 0 ; i < images.length ; ++i) + { + images[i].height = newHList[i]; + } +} + +//Renvoi un tuple (with,height) de la taille de la surface d'affichage du navigateur +function getClientWindowSize() +{ + var w = 0; + var h = 0; + + if (document.body) + { + w = (document.body.clientWidth); + h = (document.body.clientHeight); + } + else + { + w = (window.innerWidth); + h = (window.innerHeight); + } + + return [w,h]; +} + +//renvoie la hauteur optimal de chaque image pour occuper toute la largeur de la surface d'affichage +function getOptimalHeights(images, bestHeight) +{ + var imageHeight = bestHeight; + var originalSizes = getAllImageSizesForHeight(images, imageHeight); + var clientSize = getClientWindowSize(); + var newHeights = new Array(); + var allWidth = new Array(); + for(var i = 0 ; i < originalSizes.length ; ++i) + { + allWidth.push(originalSizes[i][0]); + } + + var splittedWidth = splitTab(allWidth, clientSize[0]); + for(var i = 0 ; i < splittedWidth.length ; ++i) + { + var sum = 15; + var ratiosum = 0.0; + for(var j=0 ; j< splittedWidth[i].length ; ++j) + { + sum += splittedWidth[i][j] + 5; + ratiosum += parseFloat(splittedWidth[i][j]) / parseFloat(imageHeight); + } + var deltaHeight = parseInt((clientSize[0] - sum) / parseFloat(ratiosum)); + + var lastandtoobig = i == (splittedWidth.length-1) && sum < clientSize[0]/2; + + for(var j=0 ; j< splittedWidth[i].length ; ++j) + { + if(lastandtoobig) + { + newHeights.push(bestHeight); + } + else + { + newHeights.push(imageHeight + deltaHeight); + } + } + } + return newHeights; +} + +//donne la taille de toutes les images affichées +function getAllImageSizes(images) +{ + var sizes = new Array(); + for (var i = 0; i < images.length; i++) { + sizes.push([images[i].width, images[i].height]); + } + return sizes; +} + +//donne la taille de toutes les images affichées, redimensionnées pour une hauteur donnée +function getAllImageSizesForHeight(images, height) +{ + var sizes = new Array(); + for (var i = 0; i < images.length; i++) { + sizes.push([images[i].width / (images[i].height / height) , height]); + } + return sizes; +} + + + + +//Renvoi un tableau de tableau, correspondant au découpage du tableau d'entrée découpé par tranche de MAX +function splitTab(tab, max) +{ + var splitedTabs = [new Array()]; + var sumSize = 15; + for (var i = 0; i < tab.length; i++) + { + element = tab[i]; + + var total = sumSize + element + 5; + //regles arbirtaire de découpage en plus de total > max + //(parce que ca rend mieux visuellement) + //=> on ajoute la suite l'élement qui dépasse si sa taille fait moins d'1/4 de max + //=> ou si l'écart restant représente plus de la moitié de l'élément à ajouter + if((total > max && (sumSize > max ||(max - sumSize) > (element / 2) || element > max / 4)) || element >= max) + { + splitedTabs.push(new Array()); + splitedTabs[splitedTabs.length - 1].push(element); + sumSize = 16 + element + 4; + } + else + { + splitedTabs[splitedTabs.length - 1].push(element); + sumSize = total; + } + } + return splitedTabs; +} diff --git a/plugins/balanced/style.css b/plugins/balanced/style.css new file mode 100644 index 0000000..69bc4e1 --- /dev/null +++ b/plugins/balanced/style.css @@ -0,0 +1,5 @@ +.image { + display: block; + width: auto; + height: auto; +}