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

C++Builder Discussion :

BC++Builder : Redimensionner image


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut BC++Builder : Redimensionner image
    Bonjour a tous,

    j'aimerais savoir comment je pourrais redimensionner avec Borland C++ Builder ?

    J'ai bien beau redimensionner le width et le height de Image1 mais lorsque je fais un SaveToFile, l'image a encore les dimensions originales...

    J'attends votre coup de main !

    Merci

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Les dimensions de TImage sont celles de la visualisation (sa propre fenêtre).
    Les dimensions réelles de l'image sont celles de son bitmap :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Image->Picture->Bitmap->Width
    Image->Picture->Bitmap->Height
    Si on modifie ces valeurs à ce niveau là, l'image ne subit aucun stretch, donc elle est soit rognée soit augmentée de n pixels.

    Si tu veux enregistrer l'image en y appliquant un stretch, il faut créer un bitmap temporaire et utiliser TCanvas::StretchDraw.
    Le stretch s'applique du bitmap source vers le bitmap temporaire et il suffit ensuite de sauvegarder ce bitmap temporaire puis de le détruire !

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // REM : TImage *Image1
    AnsiString Filename = "bla...bla...";
    Graphics::TBitmap *Temp = new Graphics::TBitmap;
    Temp->Width = ...;
    Temp->Height = ...;
    TRect DestRect = Rect(0,0,Temp->Width, Temp->Height);
    Temp->Canvas->StretchDraw(DestRect, Image1->Picture->Bitmap);
    Temp->SaveToFile(Filename);
    delete Temp;
    A plus !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Salut,

    merci pour ta reponse rapide !

    J'ai essayé ton code avec une image jpg et l'image créée et redimensionnée est vide.. Elle n'a rien dedans.. Le fichier existe et a les bonnes dimensions, pese 1.17 mo mais il n'y a rien dedans..

    Je l'ai aussi essayer de le sauvegarder en bitmap, ca donne le meme resultat..

    Comment régler cela ?

    J'ai pourtant bien copier ton code (et analyser) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // REM : TImage *Image1
        AnsiString Filename = "C:\\test.jpg";
        Graphics::TBitmap *Temp = new Graphics::TBitmap;
        Temp->Width = 640;
        Temp->Height = 480;
        TRect DestRect = Rect(0,0,Temp->Width, Temp->Height);
        Temp->Canvas->StretchDraw(DestRect, Image1->Picture->Bitmap);
        Temp->SaveToFile(Filename);
        delete Temp;
    Merci

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        AnsiString Filename = "C:\\test.jpg";
        Graphics::TBitmap *Temp = new Graphics::TBitmap;
        Image1->Picture->LoadFromFile(Filename);
        Temp->Width = 640;
        Temp->Height = 480;
        TRect DestRect = Rect(0,0,Temp->Width, Temp->Height);
        Temp->Canvas->StretchDraw(DestRect, Image1->Picture->Bitmap);
        Temp->SaveToFile(Filename);
        delete Temp;

    Je pense ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Non Image1 a bel et bien sa photo...

    Merci

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    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
    Image1->Visible=false;
    TJPEGImage*imagemodif =new TJPEGImage();
          OpenPictureDialog1->Execute();
          Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
          AnsiString ext;
          ext=ExtractFileExt(OpenPictureDialog1->FileName);
           if(ext==".jpg" || ext==".JPG" )
           { imagemodif->LoadFromFile(OpenPictureDialog1->FileName);
             Image1->Picture->Bitmap->Assign(imagemodif);
               }
    Graphics::TBitmap *Temp = new Graphics::TBitmap;
        Temp->Width = 640;
        Temp->Height = 480;
        TRect DestRect = Rect(0,0,Temp->Width, Temp->Height);
        Temp->Canvas->StretchDraw(DestRect, Image1->Picture->Bitmap);
        Temp->SaveToFile(OpenPictureDialog1->FileName);
     
    delete Temp;
    delete imagemodif;
    normal avec le jpg , ilfaut faire çà

    ne pas oublier
    #include <jpeg.hpp>

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    OK Merci, cela fonctionne...

    mais j'aimerais comprendre pourquoi la taille de mon image originale est de 300 kb et celle de la redimensionnée de 1.17 mo ?

    Merci

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Ce doit être parce que le fichier JPG fait un encodage avec perte ce qui lui permet de gagner de la place. Il y a un facteur de qualité à règler au moment de l'enregistrement qui va permettre de gagner plus ou moins de place (haute qualité = gros fichier, basse qualité = petits fichiers).

    Si tu passes d'une image encodée avec une basse qualité (petit fichier) à une image, même plus petite, mais avec une haute qualité, alors ton fichier final peut être plus gros...

    Tu peux choisir la qualité de l'image d'un object TJPEGImage qui sera sauvé comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        TJPEGImage *image=new TJPEGImage();
        image->LoadFromFile(OpenDialog1->FileName);
        signed char quality=image->CompressionQuality; // range from 1 to 100
    Tu peux régler ce facteur
    Comme tu ne sais pas quel était le facteur de qualité de ton image d'origine alors tu sauves une image déjà dégradée mais avec une haute qualité ce qui revient à bien sauver les imperfections du précédent codage tout en en ajoutant d'autres...

    Le problème est que si tu baisses ton niveau de qualité et que ton image d'origine était de plus haute qualité, alors cette fois-ci tu auras une réelle dégradation.

    Il faudrait pouvoir récupérer le facteur qualité de l'image de départ et le reprendre pour la sauvegarde, mais malheureusement ce facteur n'est pas accessible à ma connaissance (la propriété TJPEGImage::CompressionQuality n'est pas lue depuis le fichier d'origine et n'est utilisée que pour sauvegarder...)

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    573
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 573
    Par défaut
    c est juste que c est un bitmap qui est créé , c est donc plus lourd

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Il n'y aurait pas moyen de créer un JPEG au lieu d'un Bitmap ?

    Merci

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Tu peux éventuellement sauvegarder sous la forme d'un bitmap 8 bit si le bitmap source est un 24 bits.
    Son poids sera 3 fois moindre mais avec une perte de qualité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Bitmap->PixelFormat = pf8bit;
    Sinon, il faudrait vérifier si on peut faire (il suffit de tester si ça fonctionne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TJPEGImage*image = new TJPEGImage();
    image->Assign(bitmap);
    image->SaveToFile(...);
    Ou bien vérifier s'il existe d'autres constructeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TJPEGImage*image = new TJPEGImage(bitmap);
    Comme je n'ai pas les sources de TJPEGImage...

    A plus !

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2009
    Messages : 29
    Par défaut
    Mais si cela était possible, est-ce que le JPEG serait de moindre qualité compte tenu que le fichier source est d'une resolution plus grande ainsi qu'un poids plus volumineux ?

    Il existe des pages sur internet qui dit que TJPEGImage nous laisse transformer des Bitmap en Jpeg et vice versa mais il n'y a pas de code...

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    Peut-être en testant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TJPEGImage *Dest = new TJPEGImage ();
    Dest->Assign(le_bitmap);
    Dest->SaveToFile(...);
    Comme je n'ai pas cette classe ... ???

    Sinon on peut aussi convertir en 8 bits.
    S'il est en 24 bits, ça divise le poids du fichier par 3 (avec une perte de qualité qui varie d'une image à l'autre) !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Bitmap->PixelFormat = pf8bit;
    A plus !

  14. #14
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut Inazad
    Une recherche sur les posts de ce Forum avec le mot " JPEG " mon permis de trouver ces deux liens parmis d'autres

Discussions similaires

  1. [FLASH 8] Redimensionner image
    Par arnaud_verlaine dans le forum Flash
    Réponses: 4
    Dernier message: 14/06/2006, 11h43
  2. optimisation redimensionnement image
    Par enguerran dans le forum Graphisme
    Réponses: 12
    Dernier message: 12/05/2006, 03h54
  3. Redimensionner image avant de la charger
    Par nou366 dans le forum Delphi
    Réponses: 2
    Dernier message: 11/05/2006, 13h05
  4. Redimensionner image dans MDI
    Par DEFITOP dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/05/2006, 20h02
  5. [MFC - GDI] Redimensionnement Image
    Par Ben A. dans le forum MFC
    Réponses: 3
    Dernier message: 02/02/2006, 11h54

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