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

 Delphi Discussion :

Comment réduire la hauteur et largeur d'un bitmap et jpeg avant l'utilisation ?


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut Comment réduire la hauteur et largeur d'un bitmap et jpeg avant l'utilisation ?
    Bonjour à toutes et à tous,

    Je patine avec ce code, j'aimerai pouvoir lors du chargement de mon image, la réduire avec une largeur et une hauteur connue avant de l'exploiter, soit H = 400 x largeur = 470 au cas ou l'image de base aurait d'autres dimensions.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TMainForm.bchargerClick(Sender: TObject);
    begin
      with Op1 do
        if Execute then
        begin
          Edcharger.Text := FileName;
     
    //Code pour redimensionner l'image H400 Largeur 470 ici
     
          initBackgroundBitmap(Edcharger.Text); // Utilisation de mon image
          initBackgroundLines();
        end;  
    end;
    Merci d'avance,

    Cincap

  2. #2
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 681
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 681
    Points : 7 116
    Points
    7 116
    Par défaut
    Regarde la procédure TCanvas.StretchDraw.


  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut J'avais regardé !
    Bonjour à toutes et à tous,

    @ Lung, merci pour l'info, j'avais regardé la procédure mais je ne vois pas ou l'intégrer dans mon code au chargement et forcément avant le traitement de l'image.

    De plus au moment du traitement de l'image dans le Timage, il faut que la photo soit de H400 x L470 sans quoi l'image n'est pas centrée mais le traitement se fait quand même.

    @+,

    Cincap

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    charge ton image dans un TBitmap temporaire que tu stretch.
    Ensuite tu assigne ce bitmap a ton composant TImage.

    Pour les Jpeg, le redimentionnement ne se fait pas si facilement il me semle.
    LE plsu simple de d'executer la methode DIBNeeded puis de l'assigner a un TBitmap. LA tu pourras la retailler.

    Enfin je finirais en te conseillant d'aller jetter un coup d'oeil sur l'unitee ALGraphics (a chercher sur le net) qui fourni de tres bonne fonctions de lissages, simple d'utilisation et legeres.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut Pas si simple !
    Bonsoir à toutes et à tous,

    @ clorish, Pas si simple pour le débutant, en effet même si j'assigne mon image dans un Tbitmap temporaire, l'image n'est pas redimensionnée pour autant et si je l'assigne à mon composant Timage qui lui doit avoir le strech à false pour la suite du traitement, l'effet est sur une partie de l'image.

    Et comment faire pour que le nom du bitmap temporaire soit assigné à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Edcharger.Text := FileName;
    @+,

    Cincap

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    J'y pense : TImage possede une property "Stretch" qui permet de redimentionner automatiquement l'image a la taille du Timage ...
    Combiné avec Propertionnal et Center on obtient pas mal de choses

    Comme quoi a force de bosser sur du compilquer on oublie les choses simple

    Sinon quand je parle de assign c'est ainsi :

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut J'ai déjà essayé des solutions sans succès.
    Bonjour à toutes et à tous,

    Ayant déjà essayé des solutions sans succès, je vais cloturer ce topic.

    En effet, le traitement de l'image doit absolument se faire au chargement et avant ces deux lignes de codes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if Execute then
        begin
          Edcharger.Text := FileName;
     
    //Code pour redimensionner l'image H400 Largeur 470 ici
     
          initBackgroundBitmap(Edcharger.Text); // Utilisation de mon image
          initBackgroundLines();
        end;
    Donc pas de solution exploitable.

    Merci à tous,

    Cincap

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    je ne comprends vraiement pas ce que tu cherches a faire .....
    Explique plus en detail le but de ce redimentionnement et ce que tu cherche exactement a faire ...

    Car des solutions, il y en a plein et c'est etonnant qu'avec celles que l'on a proposé tu n'y ai pas trouvé ton bonheur

    Sur le principe, je vois mal comment on peut redimentionner une image sans la charger au prealable.
    Donc, quoi qu'il arrive, il te faudra charger l'image, effectuer le traitement "resize" dessus, avant de la transmettre a ta fonction de traitement "officiel".

    Ou alors .... ne serait il pas plus simple d'obliger les utilisateur a fournir des images au bon format ?!?

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut Rep
    En effet, charger les images avec déjà les dimensions 470x400 était une solution de contrainte.

    D'autant que c'est une application non professionnelle.

    Le principe du resize doit se faire à l'endroit indiqué, car à l'ouverture de mon application, j'impose déjà une image aux dimensions requises, et je permet le chargement de ses propres photos sans avoir a respecter les dimensions de 470 x 400.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TMainForm.bchargerClick(Sender: TObject);
    begin
      with Op1 do
        if Execute then
        begin
          Edcharger.Text := FileName;
     
    //Code pour redimensionner l'image H400 Largeur 470 ici en utilisant à la fin du traitement "Edcharger.Text" comme conteneur avant de l'appliquer au Timage 
          
    initBackgroundBitmap(Edcharger.Text); // Utilisation de mon image
          initBackgroundLines();
        end;  
    end;
    Par contre avant de choisir cette nouvelle image, dans le cas ou elle est déjà dimensionnée, c'est ok, par contre si les dimensions sont plus grandes, la photo n'apparait pas en entier ce qui est logique et l'effet ne se fait que sur une partie de l'image.

    @+,

    Cincap

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    je ne vois pas ou est ton probleme

    Tu utilise bien un TImage pour afficher ton image non ?
    Dans ce cas en basculant la property Timage.stretch a true et en jouant sur les prop Proportional et center tu regle ton probleme.

    Sinon, tu dois creer un TBitmap, charger l'image dedans, puis soit copier le contenu du TBitmap dans le TImage via la methode stretch draw ... soit dans un 2e bitmap temporaire de bonne dimention, toujours via la methode stretch draw.

    ensuite, tu n'as plus qu'a assigner ton bitmap contenant l'image retaillée dans le TImage (property Bitmap il me semble)

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut Pas si simple !
    oui vu comme cela cela devrait fonctionner, mais le Timage subit un traitement d'effets, par conséquent avant de réaliser ces effets, la nouvelle image qui sera chargée devra avoir 470 x 400, c'est pourquoi j'aurai bien voulu avoir un traitement avant l'initiation du background.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    initBackgroundBitmap(Edcharger.Text); // Utilisation de mon image
          initBackgroundLines();
    Je pense que je vais laisser comme cela.

    Merci encore.

    @+,

    Cincap

  12. #12
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    LA property Stretch retaille l'image lors de son chargement dans le TImage.

    Sinon le traitement sur Bitmap temporaires te permet de gerer la retaille lors du chargement, et donc d'affecter au bitmap l'image retaillée avant de lancer le traitement sur le TImage.

    A noter que le traitement directemetn sur TImage est tres lent du fait que toutes modification du timage entraine une reactualisation du reaffichage.

    une image de 100x100 dont on modifie tous les pixels par la property Pixels provoque 10.000 reactualisations d'affichage...

    En general on effectue ces traitements sur Bitmap temporaires affectés en une fois dnasz le TImage.

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut Voici mon essai
    Bonjour à toutes et à tous,

    Je viens de faire un essai, et si je sauve mon image redimensionnée dans un dossier, elle est bien redimensionnée.

    Par contre, je ne veux pas la sauver mais bien l'attribuer à "Edcharger.Text := ".

    au lieu d'utiliser pour la hauteur et la largeur un Tspinedit (Coeff), j'aurai préféré une hauteur et largeur définie avec un Tedit par exemple.


    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
    32
    33
    34
    35
    36
    37
    procedure TMainForm.bchargerClick(Sender: TObject);
    Var jpg :TJpegImage;
        Bmp :TBitMap;
    begin
      // Sélection de l'image
      If Not Op1.Execute Then Exit;
     
      // Création des variables temporaires
      Jpg := TJpegImage.Create;
      Bmp := TBitMap   .Create;
      Try
     
        // Lecture de l'image
        Jpg.LoadFromFile(Op1.FileName);
     
        // Le BitMap est adpapté à la taille voulue
        Bmp.Width  :=Jpg.Width * Coeff.Value Div 100;
        Bmp.Height :=Jpg.Height * Coeff.Value Div 100;
     
        // L'image est dessinée dans la totalité de la surface du BitMap
        Bmp.Canvas.StretchDraw(Bmp.Canvas.ClipRect,Jpg);
     
        // Puis la nouvelle image est assignée au JPG
        Jpg.Assign(Bmp);
     
        // et enfin elle est enregistrée
        //Jpg.SaveToFile(Sauver.FileName);
     
        Edcharger.Text := ? ;
     
          initBackgroundBitmap(Edcharger.Text);
          initBackgroundLines();
      Finally
        // libération des ressources
        Jpg .Free;
        Bmp .Free;
      End;
    Si quelqu'un à une idée merci d'avance,

    Cincap

  14. #14
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Moi je ferais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Bmp.Canvas.StretchDraw(Bmp.Canvas.ClipRect,Jpg);
     
    initBackgroundBitmap(Bmp);
    initBackgroundLines();
    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Procedure InitBackGround(ABmp : TBitmap);
    Begin
    [...]
    Self.Image1.Picture.Bitmap.assign(ABmp);
    [...]
    End;

  15. #15
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Si cela t'intérresse, je possède une fonction de redimensionnement avec filtre anti-aliasing. La qualité du résultat est bien supérieure à un redimensionnement réalisé avec StretchDraw, surtout lorsqu'on réduit l'image...
    http://www.developpez.net/forums/sho...php?t=377757#9

  16. #16
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut Merci à tous les deux !
    Voila, je vais faire le test et je vous tiens au courant.

    J'ai déjà une procédure que je dois respecter.

    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
    procedure TMainForm.initBackgroundBitmap(fileName: string);
    begin
     
     
      if not assigned(backgroundBitmap) then backgroundBitmap := TBitmap.Create();
      try
     
            LoadBackground(fileName);
     
        backgroundBitmap.PixelFormat := pf24bit;
     
      except
            showMessage('Erreur: ce n''est pas une image adéquate');
      end;
    end;
    Merci encore, je teste pour demain.

    @+,

    Cincap

  17. #17
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut J'ai essayé le lien
    Bonjour à toutes et à tous,

    @ sub0, j'ai testé ton lien avec ta fonction (AAlias), mais je ne vois aucun changement de l'image, de plus rien ne s'affiche dans "imageD".

    J'ai certainement loupé quelque chose.

    @ Clorish, j'ai une exception sur la ligne "self.Image1.Picture.Bitmap.assign(ABmp);", il ne reconnait pas "self".


    @+,

    Cincap

  18. #18
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Si il ne reconnait pas "Self" c'est que tu l'execute dans une procedure dite "libre", c'est a dire en dehors d'une methode de classe.

    Ensuite, si tu dois vraiement respecter la procedure et donc ne pas la changer dans son contenu, tu ne peux pas faire autrement que de passer par une sauvegarde de ton fichier sur le HDD (un repertoire workspace ou project ?!?) avant de transmettre le lien a ta fonction.

    PAr contre si c'est jsute l'entete qui doit rester le meme, alors il te faudra inclure le chargement et la retaille de l'image directement dans la methode Init.

    [Edit] en fait je ferais ceci :

    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
     
    procedure TMainForm.initBackgroundBitmap(fileName: string);
    Var Bmp : TBitmap;
    begin
    Bmp := TBitmap.Create;
    if not assigned(backgroundBitmap) then backgroundBitmap := TBitmap.Create();
    BackGroundBitmap.width := 400;
    BackGroundBitmap.Height := 470;
    try
      BMP.LoadFromFile(fileName);
      BackgroundBitmap.Canvas.StretchDraw(BMP.ClipREct, BMP.Canvas);
      backgroundBitmap.PixelFormat := pf24bit;
    except
      showMessage('Erreur: ce n''est pas une image adéquate');
    end;
    end;
    Maintenant si tu veux conserver ta procedure Load, Il serait preferable qu'elle ne charge pas l'image dans le Bitmap Background mais retourne dans un Bitmap passé en parametre. C'est plus propre et plus generique.
    On transmettra aison BMP.

    Si tu ne dois pas non plus la changer du tout, il te faudra donc copier le contenu du BackGroundBitmap apres chargement dans le BMP, puis effectuer l'etape de retaille : Changement des parametres Width/Height du BackGroundBitmap et faire le StretchDraw.(ou autre methode de copie lissée).

  19. #19
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 470
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 470
    Points : 1 343
    Points
    1 343
    Par défaut Erreur de compilation
    Même erreur, identificateur non déclaré "ClipREct" et types incompatibles "Tgraphic et Tcanvas".

    Je vais voir dans le temps si j'ai une solution, sinon tant pis.

    Merci encore, je cloture ce topic.

    @+,

    Cincap

  20. #20
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Desolé .... j'ai fait ca de tete
    Je n'avais pas Delphi sous la main

    ClipRect est une property de TBitmap.Canvas
    Quand a la 2e erreur, c'est seulement BMP et non BMP.Canvas qu'il faut mettre. Confusion avec CopyREct .....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/04/2012, 21h59
  2. [AC-2010] Comment definir la hauteur et largeur de la fenêtre
    Par Nephi dans le forum IHM
    Réponses: 5
    Dernier message: 07/11/2010, 16h19
  3. [JMF][MediaPlayer] hauteur et largeur de la video
    Par mbp566 dans le forum Multimédia
    Réponses: 3
    Dernier message: 07/08/2002, 16h19
  4. comment réduire une image jpeg (taille x*y)
    Par don-diego dans le forum C
    Réponses: 4
    Dernier message: 14/07/2002, 21h06

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