Changeset 115805 in spip-zone


Ignore:
Timestamp:
Jun 27, 2019, 12:44:33 PM (2 years ago)
Author:
cedric@…
Message:

Mise a jour de la lib AdaptiveImages? et utilisation de la nouvelle feature pour tentative de generation d'une thumbnail svg en double degrade croises (horizontal+vertical) selon methode proposee par Arno* https://seenthis.net/messages/660728#message661081
Le resultat est loin d'etre convaincant sur une photo qui n'a pas vraiment un axe directionnel, on laisse commente pour le moment, c'est utilisable a titre experimental si quelqu'un veut s'amuser a ameliorer la fonction
Neanmoins on ouvre la porte vers d'autre generateurs vectoriels d'apercu (cf potrace ou primitives https://seenthis.net/messages/645575)

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

Legend:

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

    r115793 r115805  
    44 *
    55 * @plugin     Adaptive Images
    6  * @copyright  2013
     6 * @copyright  2013-2019
    77 * @author     Cedric
    88 * @licence    GNU/GPL
     
    103103                $AdaptiveImages->lazyload = true;
    104104
     105        // Experimental : generer des thumbnails svg a base de gradients (mais resultat assez bof)
     106        //$AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_gradients";
    105107}
    106108
     
    180182        }
    181183        return $res;
     184}
     185
     186function adaptive_images_preview_gradients($image, $options) {
     187        $gradients = charger_fonction("image_gradients", "preview");
     188        //spip_timer('gradients');
     189        if ($thumbnail = $gradients($image, $options)) {
     190                //var_dump($thumbnail,filesize($thumbnail),spip_timer('gradients'));
     191                return array($thumbnail, 'gradients');
     192        }
     193        return false;
    182194}
    183195
  • _plugins_/adaptive_images/trunk/lib/AdaptiveImages/AdaptiveImages.php

    r115790 r115805  
    33 * AdaptiveImages
    44 *
    5  * @version    1.10.0
     5 * @version    1.11.0
    66 * @copyright  2013-2019
    77 * @author     Nursit
     
    126126        protected $lazyload = false;
    127127
     128        /**
     129         * Name of a function to call to generate the thumbnail instead of the internal process
     130         * @var string
     131         */
     132        protected $thumbnailGeneratorCallback = null;
    128133
    129134        /**
     
    161166                                throw new InvalidArgumentException("Property {$property} needs a bool value");
    162167                }
    163                 elseif (in_array($property,array("lowsrcJpgBgColor","destDirectory"))){
     168                elseif (in_array($property,array("lowsrcJpgBgColor","destDirectory","thumbnailGeneratorCallback"))){
    164169                        if (!is_string($value))
    165170                                throw new InvalidArgumentException("Property {$property} needs a string value");
     
    316321
    317322                        // Common styles for all adaptive images during loading
    318                         $base_style = "<style type='text/css'>"."img.adapt-img,.lazy img.adapt-img{opacity:0.70;filter:blur(5px);max-width:100%;height:auto;}"
     323                        $base_style = "<style type='text/css'>"."img.adapt-img,.lazy img.adapt-img{max-width:100%;height:auto;}img.adapt-img.blur{filter:blur(5px)}"
    319324                        .".adapt-img-wrapper,.adapt-img-wrapper::after{display:inline-block;max-width:100%;position:relative;-webkit-background-size:100% auto;-webkit-background-size:cover;background-size:cover;background-repeat:no-repeat;line-height:1px;overflow:hidden}"
    320325                        .".adapt-img-background::after{display:none;width:100%;height:0;}"
     
    643648                }
    644649
    645                 // Build the fallback img : High-compressed JPG
    646                 // Start from the mobile version if available or from the larger version otherwise
    647                 if ($wk>$w
    648                         AND $w<$maxWidth1x
    649                         AND $w<$this->maxWidthFallbackVersion){
    650                         $fallback = $images[$w]['10x'];
    651                         $wfallback = $w;
    652                 }
    653 
    654                 $process_fallback = true;
    655                 if ($wfallback > $this->maxWidthFallbackVersion) {
    656 
    657                         $bigger_mistake = $h;
    658                         $best_width = $this->maxWidthFallbackVersion;
    659                         // optimise this $wfallback to avoid a too big rounding mistake in the height thumbnail resizing
    660                         foreach ([1,1.25,1.333,1.5,1.666,1.75,2] as $x) {
    661                                 $wfallback = round($x * $this->maxWidthFallbackVersion);
    662                                 list($fw,$fh) = $this->computeImageSize($w, $h, $wfallback,10000);
    663                                 $mistake = abs(($h - ($fh * $w / $fw)) * $maxWidth1x / $w);
    664                                 if ($mistake < $bigger_mistake) {
    665                                         $best_width = $wfallback;
    666                                         $bigger_mistake = $mistake;
    667                                         // if less than 1px of rounding mistake, let's take this size
    668                                         if ($mistake < 1) {
    669                                                 break;
     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                                'maxWidthFallbackVersion' => $this->maxWidthFallbackVersion,
     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->maxWidthFallbackVersion){
     676                                $fallback = $images[$w]['10x'];
     677                                $wfallback = $w;
     678                        }
     679
     680                        $process_fallback = true;
     681                        if ($wfallback > $this->maxWidthFallbackVersion) {
     682
     683                                $bigger_mistake = $h;
     684                                $best_width = $this->maxWidthFallbackVersion;
     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->maxWidthFallbackVersion);
     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;
     696                                                }
    670697                                        }
    671698                                }
    672                         }
    673                         $wfallback = $best_width;
    674 
    675 
    676                         $q = $this->lowsrcQualityOptimize($wfallback, $this->lowsrcJpgQuality, $w, $h, $maxWidth1x);
    677                         $fallback = $this->processBkptImage($is_mobile ? $srcMobile : $src, $wfallback, $wfallback, '10x', $extension, true, $q);
    678                         // if it's already a jpg nothing more to do here, otherwise double compress produce artefacts
    679                         if ($extension === 'jpg') {
    680                                 $process_fallback = false;
    681                         }
    682                 }
    683 
    684 
    685                 // if $this->onDemandImages == true image has not been built yet
    686                 // in this case ask for immediate generation
    687                 if (!file_exists($fallback)){
    688                         $mime = ""; // not used here
    689                         $this->processBkptImageFromPath($fallback, $mime);
    690                 }
    691 
    692                 if ($process_fallback) {
    693                         $q = $this->lowsrcQualityOptimize($wfallback, $this->lowsrcJpgQuality, $w, $h, $maxWidth1x);
    694                         $images["fallback"] = $this->img2JPG($fallback, $this->destDirectory."fallback/", $this->lowsrcJpgBgColor, $q);
    695                 }
    696                 else {
    697                         $infos = $this->readSourceImage($fallback, $this->destDirectory."fallback/", 'jpg');
    698                         //if ($infos['creer']) {
    699                                 @copy($fallback, $infos["fichier_dest"]);
    700                         //}
    701                         $images["fallback"] =  $infos["fichier_dest"];
     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;
     707                                }
     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"]);
     726                                //}
     727                                $images["fallback"] =  $infos["fichier_dest"];
     728                        }
     729                        $images["fallback_class"] = 'blur';
    702730                }
    703731
     
    762790                // provided fallback image?
    763791                $fallback_file = "";
     792                $fallback_class = "";
    764793                if (isset($bkptImages['fallback'])){
    765794                        $fallback_file = $bkptImages['fallback'];
    766795                        unset($bkptImages['fallback']);
    767796                }
     797                if (isset($bkptImages['fallback_class'])){
     798                        $fallback_class = $bkptImages['fallback_class'];
     799                        $class = trim("$fallback_class $class");
     800                        unset($bkptImages['fallback_class']);
     801                }
     802
    768803                // else we use the smallest one
    769804                if (!$fallback_file){
     
    831866
    832867                        $img = $this->setTagAttribute($img,"src",$fallback_file);
    833                         $img = $this->setTagAttribute($img,"class","adapt-img $class");
     868                        $img = $this->setTagAttribute($img,"class",trim("adapt-img $class"));
    834869                        $img = $this->setTagAttribute($img,"onmousedown","adaptImgFix(this)");
    835870                        // $img = setTagAttribute($img,"onkeydown","adaptImgFix(this)"); // useful ?
     
    9941029                        'png' => 'image/png',
    9951030                        'gif' => 'image/gif',
     1031                        'svg' => 'image/svg+xml',
    9961032                );
    9971033
Note: See TracChangeset for help on using the changeset viewer.