Changeset 115810 in spip-zone


Ignore:
Timestamp:
Jun 27, 2019, 4:22:13 PM (8 weeks ago)
Author:
cedric@…
Message:

Nouveau generateur de thumbnail experimental, a partir de Potracio, le portage php de potrace cf https://seenthis.net/messages/645575
En resume : avec les reglages de base, et en tournant sur l'image d'origine on a un trace vectoriel hyper detaille mais et qui prend facilement 100ko, donc ca remplit pas le besoin
Mais en travaillant sur une image miniature de 128px et en ajustant un peu la config de Potracio on arrive a avoir un trace des grandes formes sans trop de detail
Derriere on le bidouille pour appliquer une couleur de fond et de la forme declinee depuis la couleur moyenne de l'image d'origine, et on compresse tout ca en arrondissant tous les points du trace SVG

Au final on obtient une imahe svg interessante qui va de 500octets pour les formes les plus simples a 5ko environ pour les images avec le plus de complexites de traces.
De la disparite, mais c'est competitif avec le jpg/blur, pour un rendu tres different

A voir/tester (en decommantant) et on pourrait eventuellement le proposer en config du plugin comme alternative au jpg/blur

Location:
_plugins_/adaptive_images/trunk
Files:
6 added
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/adaptive_images/trunk/adaptive_images_options.php

    r115809 r115810  
    112112        // Experimental : generer des thumbnails svg a base de gradients (mais resultat assez bof)
    113113        //$AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_gradients";
     114        // Experimental : generer des thumbnails svg a base de Potrace
     115        //$AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_potrace";
    114116}
    115117
     
    198200                return array($thumbnail, 'gradients');
    199201        }
     202        return false;
     203}
     204
     205function adaptive_images_preview_potrace($image, $options) {
     206        $gradients = charger_fonction("image_potrace", "preview");
     207        //spip_timer('potrace');
     208        if ($thumbnail = $gradients($image, $options)) {
     209                //var_dump($thumbnail,filesize($thumbnail),spip_timer('potrace'));
     210                return array($thumbnail, 'potrace');
     211        }
     212        //spip_timer('potrace');
    200213        return false;
    201214}
  • _plugins_/adaptive_images/trunk/lib/AdaptiveImages/AdaptiveImages.php

    r115809 r115810  
    33 * AdaptiveImages
    44 *
    5  * @version    1.11.2
     5 * @version    1.11.3
    66 * @copyright  2013-2019
    77 * @author     Nursit
     
    648648                }
    649649
    650                 $fallback_directory = $this->destDirectory."fallback/";
    651                 if (!is_null($this->thumbnailGeneratorCallback) && is_callable($this->thumbnailGeneratorCallback)) {
    652                         $options = [
    653                                 'dir' => $fallback_directory,
    654                                 'images' => $images,
    655                                 'src' => $src,
    656                                 'srcMobile' => $srcMobile,
    657                                 'lowsrcWidth' => $this->lowsrcWidth,
    658                                 'lowsrcJpgQuality' => $this->lowsrcJpgQuality,
    659                         ];
    660                         $callback = $this->thumbnailGeneratorCallback;
    661                         if ($res = $callback($img, $options)) {
    662                                 list($image, $class) = $res;
    663                                 $images["fallback"] = $image;
    664                                 $images["fallback_class"] = $class;
    665                         }
    666                 }
    667 
    668                 // default method for fallback generation if no external callback provided or if it failed
    669                 if (empty($images["fallback"])) {
    670 
    671                         // Build the fallback img : High-compressed JPG
    672                         // Start from the mobile version if available or from the larger version otherwise
    673                         if ($wk>$w
    674                                 AND $w<$maxWidth1x
    675                                 AND $w<$this->lowsrcWidth){
    676                                 $fallback = $images[$w]['10x'];
    677                                 $wfallback = $w;
    678                         }
    679 
    680                         $process_fallback = true;
    681                         if ($wfallback > $this->lowsrcWidth) {
    682 
    683                                 $bigger_mistake = $h;
    684                                 $best_width = $this->lowsrcWidth;
    685                                 // optimise this $wfallback to avoid a too big rounding mistake in the height thumbnail resizing
    686                                 foreach ([1,1.25,1.333,1.5,1.666,1.75,2] as $x) {
    687                                         $wfallback = round($x * $this->lowsrcWidth);
    688                                         list($fw,$fh) = $this->computeImageSize($w, $h, $wfallback,10000);
    689                                         $mistake = abs(($h - ($fh * $w / $fw)) * $maxWidth1x / $w);
    690                                         if ($mistake < $bigger_mistake) {
    691                                                 $best_width = $wfallback;
    692                                                 $bigger_mistake = $mistake;
    693                                                 // if less than 1px of rounding mistake, let's take this size
    694                                                 if ($mistake < 1) {
    695                                                         break;
     650                if (!$asBackground) {
     651
     652                        $fallback_directory = $this->destDirectory."fallback/";
     653                        if (!is_null($this->thumbnailGeneratorCallback) && is_callable($this->thumbnailGeneratorCallback)) {
     654                                $options = [
     655                                        'dir' => $fallback_directory,
     656                                        'images' => $images,
     657                                        'src' => $src,
     658                                        'srcMobile' => $srcMobile,
     659                                        'lowsrcWidth' => $this->lowsrcWidth,
     660                                        'lowsrcJpgQuality' => $this->lowsrcJpgQuality,
     661                                ];
     662                                $callback = $this->thumbnailGeneratorCallback;
     663                                if ($res = $callback($img, $options)) {
     664                                        list($image, $class) = $res;
     665                                        $images["fallback"] = $image;
     666                                        $images["fallback_class"] = $class;
     667                                }
     668                        }
     669
     670                        // default method for fallback generation if no external callback provided or if it failed
     671                        if (empty($images["fallback"])) {
     672
     673                                // Build the fallback img : High-compressed JPG
     674                                // Start from the mobile version if available or from the larger version otherwise
     675                                if ($wk>$w
     676                                        AND $w<$maxWidth1x
     677                                        AND $w<$this->lowsrcWidth){
     678                                        $fallback = $images[$w]['10x'];
     679                                        $wfallback = $w;
     680                                }
     681
     682                                $process_fallback = true;
     683                                if ($wfallback > $this->lowsrcWidth) {
     684
     685                                        $bigger_mistake = $h;
     686                                        $best_width = $this->lowsrcWidth;
     687                                        // optimise this $wfallback to avoid a too big rounding mistake in the height thumbnail resizing
     688                                        foreach ([1,1.25,1.333,1.5,1.666,1.75,2] as $x) {
     689                                                $wfallback = round($x * $this->lowsrcWidth);
     690                                                list($fw,$fh) = $this->computeImageSize($w, $h, $wfallback,10000);
     691                                                $mistake = abs(($h - ($fh * $w / $fw)) * $maxWidth1x / $w);
     692                                                if ($mistake < $bigger_mistake) {
     693                                                        $best_width = $wfallback;
     694                                                        $bigger_mistake = $mistake;
     695                                                        // if less than 1px of rounding mistake, let's take this size
     696                                                        if ($mistake < 1) {
     697                                                                break;
     698                                                        }
    696699                                                }
    697700                                        }
     701                                        $wfallback = $best_width;
     702
     703
     704                                        $q = $this->lowsrcQualityOptimize($wfallback, $this->lowsrcJpgQuality, $w, $h, $maxWidth1x);
     705                                        $fallback = $this->processBkptImage($is_mobile ? $srcMobile : $src, $wfallback, $wfallback, '10x', $extension, true, $q);
     706                                        // if it's already a jpg nothing more to do here, otherwise double compress produce artefacts
     707                                        if ($extension === 'jpg') {
     708                                                $process_fallback = false;
     709                                        }
    698710                                }
    699                                 $wfallback = $best_width;
    700 
    701 
    702                                 $q = $this->lowsrcQualityOptimize($wfallback, $this->lowsrcJpgQuality, $w, $h, $maxWidth1x);
    703                                 $fallback = $this->processBkptImage($is_mobile ? $srcMobile : $src, $wfallback, $wfallback, '10x', $extension, true, $q);
    704                                 // if it's already a jpg nothing more to do here, otherwise double compress produce artefacts
    705                                 if ($extension === 'jpg') {
    706                                         $process_fallback = false;
     711
     712
     713                                // if $this->onDemandImages == true image has not been built yet
     714                                // in this case ask for immediate generation
     715                                if (!file_exists($fallback)){
     716                                        $mime = ""; // not used here
     717                                        $this->processBkptImageFromPath($fallback, $mime);
    707718                                }
    708                         }
    709 
    710 
    711                         // if $this->onDemandImages == true image has not been built yet
    712                         // in this case ask for immediate generation
    713                         if (!file_exists($fallback)){
    714                                 $mime = ""; // not used here
    715                                 $this->processBkptImageFromPath($fallback, $mime);
    716                         }
    717 
    718                         if ($process_fallback) {
    719                                 $q = $this->lowsrcQualityOptimize($wfallback, $this->lowsrcJpgQuality, $w, $h, $maxWidth1x);
    720                                 $images["fallback"] = $this->img2JPG($fallback, $fallback_directory, $this->lowsrcJpgBgColor, $q);
    721                         }
    722                         else {
    723                                 $infos = $this->readSourceImage($fallback, $fallback_directory, 'jpg');
    724                                 if ($infos['creer']) {
    725                                         @copy($fallback, $infos["fichier_dest"]);
     719
     720                                if ($process_fallback) {
     721                                        $q = $this->lowsrcQualityOptimize($wfallback, $this->lowsrcJpgQuality, $w, $h, $maxWidth1x);
     722                                        $images["fallback"] = $this->img2JPG($fallback, $fallback_directory, $this->lowsrcJpgBgColor, $q);
    726723                                }
    727                                 $images["fallback"] =  $infos["fichier_dest"];
    728                         }
    729                         $images["fallback_class"] = 'blur';
     724                                else {
     725                                        $infos = $this->readSourceImage($fallback, $fallback_directory, 'jpg');
     726                                        if ($infos['creer']) {
     727                                                @copy($fallback, $infos["fichier_dest"]);
     728                                        }
     729                                        $images["fallback"] =  $infos["fichier_dest"];
     730                                }
     731                                $images["fallback_class"] = 'blur';
     732                        }
    730733                }
    731734
Note: See TracChangeset for help on using the changeset viewer.