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

Composants VCL Delphi Discussion :

Agrandir un caractère seulement en hauteur dans un TImage


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut Agrandir un caractère seulement en hauteur dans un TImage
    Bonjour a tous,

    Je cherche une manière de faire élargir un caractère par exemple une accolade, seulement en hauteur, la largeur doit rester si possible inchangé, et puis de la faire afficher dans un Timage. La façon dont j'ai choisi est la suivante avec StretchDraw.
    Mais la qualité de l'agrandissement en hauteur est très mauvaise. Quelle meilleur style aux autres solutions pouvez vous me proposez pour avoir un meilleur résultat.

    Merci beaucoup pour vos aides.


    Voici le résulat de mon test


    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
     imgTmp, imgOrig: TBitmap;
    begin
     
      imgOrig := TBitmap.Create;
      imgOrig.Width   := 7;                         // corresond au Font size 9
      imgOrig.Height  := 14;                        // corresond au Font size 9
      imgOrig.Canvas.Font.Size := 9;            // si possible ne pas changer
      imgOrig.Canvas.TextOut(0, 0, '{');        // chr a afficher
     
      imgTmp := TBitmap.Create;
      imgTmp.Width   := 7;                         // Largeur si possible ne pas changer
      imgTmp.Height  := 90;                        // hauteur modifier
      imgTmp.Canvas.StretchDraw(imgTmp.Canvas.ClipRect, imgOrig  );
     
      image1.canvas.Draw(30, 30, imgTmp);  //  visualisation
     
    end;

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Salut,

    Est-ce-que t'as essayé d'écrire ton accollade directement dans image1 comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      image1.Canvas.Font.name:='Arial';
      image1.Canvas.Font.Size := 70;      //< 70 à ajuster si besoin est
      image1.Canvas.TextOut(30,30, '{'); // visualisation
    ... sinon ça coûte rien d'essayer.

    A+

    EDIT du même jour 14h33 : Si l'essai ci-dessus ne donne pas une qualité satisfaisante voiçi une autre suggestion basée sur ton code initial : au lieu de faire un agrandissement avec StretchDraw à partir d'un petit canvas d'accolade, faire l'inverse créer un canvas avec une accolade de taille supérieure au résultat visé et réduire ensuite la taille avec StetchDraw la qualité de l'image finale sera certainement meilleure que celle obtenue par étirement.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Je viens de tester ta proposition, mais malheureusement la largeur (7) change en fonction de la hauteur. Dans mon cas la largeur ne dois pas changer!) le but est que je veux seulement modifier la hauteur et non la largeur!
    Merci a toi.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Re-bonjour,

    J'attire ton attention sur le fait que pandant que tu répondais j'ai ajouté dans mon message précédent un EDIT avec une autre suggestion qui pourrait convenir (puisqu'elle permet de brider la largeur de l'accollade).

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Voici le résultat d'un agrandissement, premier accolade; 2ième accolade
    à partir d'une taille supérieure à une réduction.
    Le 2ième résutat et légerement meilleur, mais.....


    Salutations
    Images attachées Images attachées  

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Je viens de tester avec une procedure antialias mais le résultat n'est pas meilleur.
    Bonne journée.

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Bonjour,

    Le 2ième résutat et légerement meilleur, mais.....
    ... exact, meilleur mais pas bien net.

    Comme la moitié d'une accollade ressemble au tracé de la courbe y=k*sinus(x) dans l'intervalle où sinus(x) passe de -1 à +1 il resterait la solution de tracer l'accollade de cette manière avec canvas.MoveTo() et canvas.LineTo()
    ... mais comme l'accollade n'est qu'un exemple de caractère parmi les caractères à élargir faudrait pouvoir généraliser la démarche pour tous les caractères ... c'est à dire créer un array of TMesCaractères où TMesCaractères désigne une structure contenant l'ensemble des courbes de Bézier permettant le tracé d'un caractère donné sachant que pour mémoriser une courbe élémentaire de Bézier il suffit d'en mémoriser les coordonnées des points de contrôle (pour l'accollade il suffit de 2 fois 4 points par courbe élémentaire si on se contente d'un tracé à épaisseur constante et le double si l'on veut un tracé à double-bord).

    S'il n'y a qu'une poignée de caractères à reconstituer ça pourrait être jouable mais s'il y en a 255 ce n'est pas le code à réaliser qui pose problème mais la détermination des coordonnées des points de contrôle qui aboutissent au tracé de tel ou tel caractère ce qui nécessite d'autant plus de tâtonnements qu'on peut être tâtillon sur l'esthétique d'un caractère ... multiplié par 255 caractères ? ou moins ?

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

Discussions similaires

  1. HTML ou DHTML: probleme de hauteur dans 1 cellule
    Par pierrot10 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 30/08/2006, 09h05
  2. [VS2005]Inclure seulement certains fichiers dans une .lib
    Par NicolasJolet dans le forum Visual C++
    Réponses: 2
    Dernier message: 28/07/2006, 09h14
  3. Réponses: 8
    Dernier message: 15/07/2006, 18h59
  4. Comment agrandir une colonne à 100% en hauteur?
    Par nmathon dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 07/04/2006, 11h54
  5. Réponses: 6
    Dernier message: 24/07/2003, 12h39

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