Transformer des images dynamiquement avec Vae Soli!

image,transformation,channel,saturation,luminosité,hue,roue chromatique

2008-12-15 – 13:30

2000-12-16 – 20:00

2008-12-15 – 13:30

Voilà un article qui inaugure une petite série sur le sujet. Il s'agit de vous montrer comment il est possible de transformer des photos en PHP grâce à Vae Soli!. Dans cette toute petite introduction, nous allons vous montrer comment transformer une image de telle sorte à ne lui garder que le canal des verts.

Application d'un channel

Voici l'image originale, une photo prise à Jauchelette qui montre des enfants s'amusant dans une petite piscine gonflable. Le code PHP se basant sur Vae Soli!, se charge de créer dynamiquement une image dans le canal des verts (c'est{-}à{-}}}dire au moment même de l'appel de la page … car l'image n'existe pas auparavant).

Un jeu d'eau entre enfants. Photo originale.

Et voici l'image transformée en appliquant un filtre sur le canal des 'verts'  :

Un jeu d'eau entre enfants. Photo transformée dans le canal des verts.

Quel est le code qui permet de transformer l'image originale en image qui reste dans le canal des verts ? Il suffit de l'appel d'une seule fonction :

<?php   $szImgSrc  = "c:\\websites\\mon-site\\images\\jeu-eau.jpg";
        $szImgDest = "c:\\websites\\mon-site\\images\\jeu-eau-bis.jpg";
        IMG_GreenChannel( $szImgSrc,$szImgDest,95 );
?>

Le même type de code peut être utilisé pour créer des images dans le canal des bleus et dans le canal des rouges :

Un jeu d'eau entre enfants. Photo transformée dans le canal des bleus. Un jeu d'eau entre enfants. Photo transformée dans le canal des rouges.

… ce qui correspond au code qui suit :

<?php   $szImgSrc  = "c:\\websites\\mon-site\\images\\jeu-eau.jpg";

        $szImgDest = "c:\\websites\\mon-site\\images\\jeu-eau-ter.jpg";
        IMG_BlueChannel( $szImgSrc,$szImgDest,95 );

        $szImgDest = "c:\\websites\\mon-site\\images\\jeu-eau-quater.jpg";
        IMG_RedChannel( $szImgSrc,$szImgDest,95 );
?>

Saturation

Il est également posible de travailler sur la saturation des couleurs d'une image et comme pour l'utilisation des channels, Vae Soli! fournit une fonction simple de traitement de l'image comme vous allez vous en rendre compte.

Voici l'image originale, une image de synthèse montrant un continent virtuel.

Un continent virtuel - image de synthèse.

… et voici maintenant la même image avec une perte susbtantielle de saturation des couleurs la faisant quasiment tourner en niveaux de gris :

Un continent virtuel - image de synthèse - saturation basse.

Maintenant, voyons à quoi ressemble la même image à pleine saturation :

Un continent virtuel - image de synthèse - haute saturation.

Voici le code qui permet cette transformation :

<?php
        $szImageSrc     = FIL_ResolveRoot( "/images/transform/continent.jpg",$szRoot );
        $szImageDest    = FIL_ResolveRoot( "/images/transform/continent-high-saturation.jpg",$szRoot );

        if ( ! is_file( $szImageDest ) )
        {
            IMG_Saturation( $szImageSrc,$szImageDest,1.0,95 );
        }
?>

Négatif

Les fonctions de Vae Soli! permettent également de créer des images "négatif". Voici le négatif de l'image du continent de synthèse :

Un continent virtuel - image de synthèse en mode négatif.

Et comme rien n'est secret, voici le code qui permet d'obtenir l'image en mode négatif :

<?php
        $szImageSrc     = FIL_ResolveRoot( "/images/transform/continent.jpg",$szRoot );
        $szImageDest    = FIL_ResolveRoot( "/images/transform/continent-negatif.jpg",$szRoot );

        if ( ! is_file( $szImageDest ) )
        {
            IMG_Negate( $szImageSrc,$szImageDest,95 );
        }
?>

Colorer une image par variation de la teinte

Une variation de teinte sur la roue chromatique est possible sur les images. Voici l'image originale, une composition personnelle sur le thème "Samouraï" :

Une composition personnelle à tendance Samouraï

Et la même image avec une variation de 75° sur la roue chromatique : Une composition personnelle à tendance Samouraï

$szImageSrc     = FIL_ResolveRoot( "/images/transform/samourai.png",$szRoot );
$szImageDest    = FIL_ResolveRoot( "/images/transform/samourai-hue.png",$szRoot );

if ( ! is_file( $szImageDest ) )
{
    IMG_Hue( $szImageSrc,$szImageDest,75,90 );
}

Redimensionner une image

Vae Soli! fournit également de quoi redimensionner une image en respectant ses proportions de départ. C'est la fonction IMG_Resize() qui permet de s'adonner à ces petits jeux.

L'image du thème Samouraï, avec sa teinte modifiée et sa taille réduite de moitié : Une composition personnelle à tendance Samouraï - taille réduite de moitié

$szImageSrc     = FIL_ResolveRoot( "/images/transform/samourai-hue.png",$szRoot );
$szImageDest    = FIL_ResolveRoot( "/images/transform/samourai-hue-050.png",$szRoot );

if ( ! is_file( $szImageDest ) )
{
    IMG_Resize( $szImageSrc,$szImageDest,2,90 ); /* 2 = taille réduite de moitié */
}

Creér des vignettes (thumbnails)

Lorsqu'il s'agit de rendre toute une série d'images dans les mêmes dimensions fixes, par exemple, une galerie de visages, on a besoin d'une fonction capable de créer des vignettes.

Nous avons conçu plusieurs photos que nous allons présenter sous forme de galerie de 6 vignettes. Chaque vignette est créée dynamiquement; lorsque vous cliquez sur une vignette, vous avez accès à l'image originale ce qui vous permet de mieux vous rendre compte de ce que permet la méthode Thumbnail() de la classe LSImage sur base d'images de tailles très différentes.

Le code suivant a permis de créer les vignettes :

$szImgSrc   = FIL_ResolveRoot( "/images/transform/menudier.jpg"      ,$szRoot );
$szImgDest  = FIL_ResolveRoot( "/images/transform/menudier-thumb.jpg",$szRoot );

$oImg = new LSImage( $szImgSrc );

if ( $oImg->Open() )
{
    /* 100 = largeur
       100 = hauteur
       false = ne pas forcer les dimensions (non utilisé à ce stade)
       0 = couleur d'arrière-plan (non utilisée à ce stade)
       95 = qualité de l'image résultat */
    $oImg->Thumbnail( 100,100,false,0,95 );
    $oImg->Set( $szImgDest );
    $oImg->Save( 'jpg',95 );
    $oImg->Close();
}

$szImgSrc   = FIL_ResolveRoot( "/images/transform/papillons.jpg"      ,$szRoot );
$szImgDest  = FIL_ResolveRoot( "/images/transform/papillons-thumb.jpg",$szRoot );

$oImg = new LSImage( $szImgSrc );

if ( $oImg->Open() )
{
    $oImg->Thumbnail( 100,100,false,0,95 );
    $oImg->Set( $szImgDest );
    $oImg->Save( 'jpg',95 );
    $oImg->Close();
}

$szImgSrc   = FIL_ResolveRoot( "/images/transform/lafayette.jpg"      ,$szRoot );
$szImgDest  = FIL_ResolveRoot( "/images/transform/lafayette-thumb.jpg",$szRoot );

$oImg = new LSImage( $szImgSrc );

if ( $oImg->Open() )
{
    $oImg->Thumbnail( 100,100,false,0,95 );
    $oImg->Set( $szImgDest );
    $oImg->Save( 'jpg',95 );
    $oImg->Close();
}

$szImgSrc   = FIL_ResolveRoot( "/images/transform/louvre.jpg"      ,$szRoot );
$szImgDest  = FIL_ResolveRoot( "/images/transform/louvre-thumb.jpg",$szRoot );

$oImg = new LSImage( $szImgSrc );

if ( $oImg->Open() )
{
    $oImg->Thumbnail( 100,100,false,0,95 );
    $oImg->Set( $szImgDest );
    $oImg->Save( 'jpg',95 );
    $oImg->Close();
}

$szImgSrc   = FIL_ResolveRoot( "/images/transform/luxury.jpg"      ,$szRoot );
$szImgDest  = FIL_ResolveRoot( "/images/transform/luxury-thumb.jpg",$szRoot );

$oImg = new LSImage( $szImgSrc );

if ( $oImg->Open() )
{
    $oImg->Thumbnail( 100,100,false,0,95 );
    $oImg->Set( $szImgDest );
    $oImg->Save( 'jpg',95 );
    $oImg->Close();
}

$szImgSrc   = FIL_ResolveRoot( "/images/transform/roue.jpg"      ,$szRoot );
$szImgDest  = FIL_ResolveRoot( "/images/transform/roue-thumb.jpg",$szRoot );

$oImg = new LSImage( $szImgSrc );

if ( $oImg->Open() )
{
    $oImg->Thumbnail( 100,100,false,0,95 );
    $oImg->Set( $szImgDest );
    $oImg->Save( 'jpg',95 );
    $oImg->Close();
}

La suite au prochain numéro !

< Février 2012 >
Lu Ma Me Je Ve Sa Di
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29        
lifetime-episode

Nos autres articles

  1. Articles
    1. /articles-core.php
    2. /articles/core/MiFID/index.php
    3. /articles/core/SEPA/index.php
    4. /articles/core/accessibility-seo/index.php
    5. /articles/core/accessible-popups/index.php
    6. /articles/core/ajax/index.php
    7. /articles/core/blogs/index.php
    8. /articles/core/business-case/index.php
    9. /articles/core/closure-report/index.php
    10. /articles/core/cmmi/index.php
    11. /articles/core/css/index.php
    12. /articles/core/doctype/index.php
    13. /articles/core/dynamic-input/index.php
    14. /articles/core/dynamic-theme/index.php
    15. /articles/core/effort-de-gestion-de-projet/index.php
    16. /articles/core/error-handling-404/index.php
    17. /articles/core/estimations-programmeurs/index.php
    18. /articles/core/expressions-regulieres-php/index.php
    19. /articles/core/gestion-des-couleurs/index.php
    20. /articles/core/glossary/index.php
    21. /articles/core/ideal-team-duration/index.php
    22. /articles/core/image-transition/index.php
    23. /articles/core/inline-javascript/index.php
    24. /articles/core/investir/index.php
    25. /articles/core/it-budget/index.php
    26. /articles/core/javascript-animation/index.php
    27. /articles/core/junctions/index.php
    28. /articles/core/les-malheurs-IT/IT-soumis-business.php
    29. /articles/core/limites-de-la-croissance/club-de-rome.php
    30. /articles/core/link-rel-canonical/eviter-duplication-url-canonique.php
    31. /articles/core/link-rel/index.php
    32. /articles/core/longitude-latitude-google-maps/index.php
    33. /articles/core/meetings/index.php
    34. /articles/core/pack-and-go/index.php
    35. /articles/core/pageframe-tabs/index.php
    36. /articles/core/phases-de-projet/index.php
    37. /articles/core/php-server-variables/index.php
    38. /articles/core/pre-business-case/index.php
    39. /articles/core/project-management/principes-de-gestion-de-projet.php
    40. /articles/core/project-typology/index.php
    41. /articles/core/pso/index.php
    42. /articles/core/requirements management/index.php
    43. /articles/core/risk management/index.php
    44. /articles/core/rss/index.php
    45. /articles/core/scrum/index.php
    46. /articles/core/search-engine-optimization/accessibility-guidelines.php
    47. /articles/core/sepia/index.php
    48. /articles/core/sponsorship-meeting/index.php
    49. /articles/core/stylesheet-switching/index.php
    50. /articles/core/v-model/index.php
    51. /articles/core/wiki/index.php
    52. /articles/core/xhtml-tooltips/index.php
    53. /articles/core/xml-sitemap/index.php