IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Flouter des images [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 223
    Par défaut Flouter des images
    Bonjour à tous,

    Je souhaite flouter des images que je récupère en base de données.

    J'ai donc crée une extension twig mais cela ne fonctionne pas car j'utilise des fonctions php "imagejpeg()" et "imagefilter()" et j'ai besoin d'un header(content-type: image/jpeg) pour afficher ces images ce qui n'est possible dans un template.

    Comment puis je faire pour flouter des images (sans utiliser de CSS) ?

    Pour vous aider voici mon code :

    Ma balise img dans ma vue twig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img  class="img-thumbnail" src="{{src|flou}}" width="150px" height="150px" alt="..."/>
    Mon extension twig :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    <?php
    namespace monprojet\NotificationBundle\Twig;
     
    use Symfony\Component\HttpFoundation\Response;
     
    class TwigExtension extends \Twig_Extension
    {
        public function getFilters()
        {
            return array(
                new \Twig_SimpleFilter('flou', array($this, 'flouFilter')),
            );
        }
     
        public function flouFilter($image)
        {
     
            $response = new Response();
            $response->headers->set('Content-Type', 'image/jpeg');
            $response->send();
            $imageFlou = @imagecreatefromjpeg($image);
            imagejpeg($imageFlou);
            imagefilter($imageFlou, IMG_FILTER_GAUSSIAN_BLUR);
            imagedestroy($imageFlou);
        }
     
        public function getName()
        {
            return 'acme_extension';
        }
    }

  2. #2
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    Si tu compte faire beaucoup de traitement d'image, tu peux utiliser ce bundle : https://github.com/avalanche123/Imagine

  3. #3
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Oulà, je ne suis pas sur d'avoir compris ce que tu veux mais ça m'a l'air un brin étrange.

    Si tu ne veux pas utiliser de CSS c'est que l'image elle même doit être floue, et si l'image originale ne l'est pas, tu veux faire un traitement d'image, une copie en plus floue et afficher cette copie. Je ne dis pas de bêtise ?

    Une possibilité serait de fournir une route interne à l'attribut src de ta balise img. C'est elle qui ferait tout le boulot d'édition de l'image, et elle te retournerait l'URL correspondant à une route qui se contente de t'afficher l'image (et qui pourrait du coup avoir le header que tu veux).

    Pour faire court : voilà ce que je te suggère:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img  class="img-thumbnail" src="{{ path('route_to_blurred_img', {source: originalImgPath, height: 150, width: 150}) }}" width="150px" height="150px" alt="..."/>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    class ImageController {
        /**
         * Route 'route_to_blurred_img'
         */
        public function blurImage($originalImgPath, $height, $width)
        {
            // Le path d'une image floutée aux dimensions données
            $blurredImagePath = "/path/to/blurred/$height/$width/image";
     
            // Si tu enregistres les images tu n'auras à passer dans ce if qu'une seule fois par image/dimensions        
            if (!$image = $this->fileManager->exists($blurredImagePath) {
                $image = $this->imageManager->blur($originalImgPath);
                $image = $this->imageManager->resize($image, $height, $width);
                $this->fileManager->save($image);
            }
     
            $response = new Response();
            //... fais tout ce que t'as à faire avec tes headers ton image etc pour que ça te retourne bien juste l'image quand tu vas sur cette route
     
            return $response; 
        }
    }
    Deux services inclus dans le controller :
    - un fileManager qui vérifie l'existence d'un fichier là ou tu stockeras tes fichiers modifiés.
    - un imageManager qui fait les modifications sur un fichier image et peut éventuellement resizer en fonction des paramètres donnés

    Tu enregistres les fichiers modifiés pour ne pas faire le traitement à chaque fois que tu appelles une image floutée, et tu vérifie l'existence du fichier avant de faire le traitement.

    Pour l'implémentation des méthodes des services et la vérification des extension etc. je te laisse faire, je t'ai donné l'archi globale.

    ++

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 223
    Par défaut
    Salut Nico, tu as bien compris en effet je veux faire un traitement de l'image.

    Pas simple visiblement.
    Je prends note de ce que tu me propose, mais c'est assez complexe quand même. Il n'y a pas possibilité d'utiliser par exemple de créer un filtre en utilisant le bundle LiipImagineBundle ? Ca serait peu être plus simple ? (oui je suis un vrai developpeur = féniant lol).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 223
    Par défaut
    En utilisant ta solution, dans la fonction "blur" du service "imagemanager" j'ai juste à mettre ce traitement : ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $response = new Response();
            $response->headers->set('Content-Type', 'image/jpeg');
            $response->send();
            $imageFlou = @imagecreatefromjpeg($image);
            imagejpeg($imageFlou);
            imagefilter($imageFlou, IMG_FILTER_GAUSSIAN_BLUR);
            imagedestroy($imageFlou);

  6. #6
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Je ne connais pas ce bundle, à toi de voir s'il te permet de faire ce que tu souhaite, c'est possible.
    C'est possible également que certains services existent déjà pour faire de l'édition d'image.

    Tout ce que je t'ai donné c'est la manière de t'y prendre en utilisant une route interne à ton projet, sans nécessiter de librairie tierce.

    Ta réponse devrait plutôt ressembler à quelque chose dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new Response(readfile($blurredImage), 200, $headers);
    Et les traitement d'image se font AVANT la réponse : ce n'est pas un filtre que tu appliques : ton action crée une nouvelle image, la sauvegarde et ensuite l'affiche.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 223
    Par défaut
    J'ai bien compris le principe mais c'est la technique qui me manque la ...

    C'est pour ça que je m'orientais sur un bundle :s

    Je pense que créer une version "floutée" et la stocker lors de l'upload me sera plus simple :s

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Afficher des images sous directX
    Par cyberlewis dans le forum DirectX
    Réponses: 17
    Dernier message: 12/07/2004, 12h07
  2. Permutter des images dans ImageList ?
    Par GoustiFruit dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/12/2003, 09h07
  3. Interbase 6 et le type des images?
    Par AnestheziE dans le forum InterBase
    Réponses: 6
    Dernier message: 30/10/2003, 10h48
  4. question sur le format des images ..
    Par vbcasimir dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 28/08/2003, 12h08
  5. [TP][MULTI-PROBLEME]Comment afficher des images pcx
    Par mikoeur dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 24/10/2002, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo