Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[résolu]Redimensionner image bmp Borland C++


rickylarsen

Messages recommandés

Bonjour,

 

Je travaille actuellement sous Borland C++ 5.

Je suis amené à afficher une image (jpeg,bmp,ico…) dans un TImage bon ça pas de problème.

Mais je dois afficher des miniatures de l’image chargée (114*152 qu’on appellera moyenne et 21*28 : mini) bon avec la propriété Strech de TImage ça pose pas de trop de problème mais je pense qu’il charge l’image (en bmp ? frappez-moi si je me trompe) avec sa taille réelle donc si mon image fait 1 Mo en bmp et que je la charge une fois grandeur nature puis 12 fois en moyenne et 12 fois en mini ça fait beaucoup et d’ailleurs je retrouve ce phénomène en affichant les ressources mémoires consommé par l’application.

 

Donc j’ai essayé avec la propriété StretchDraw de Canvas mais ça marche que si je passe par un fichier temporaire que je sauvegarde sur le disque (pas top) et encore ça marche que si l’image originale est un bitmap.

 

Sinon ça ça marche mais que si l’originale est un bitmap :

 

tmp et bmp definit en tant que TBitmap ;

 

tmp->LoadFromFile(&struct_page[k].ImageMere[0]);
bmp->Width = 28;
bmp->Height = 21;
bmp->Canvas->StretchDraw(bmp->Canvas->ClipRect, tmp);
tab_mini[k]->Picture->Bitmap = bmp;

 

Par contre si je fais ça avec un Jpeg j’ai une jolie image blanche :

 

ImageOriginale->Picture->LoadFromFile(&struct_page[k].ImageMere[0]);

 

bmp->Width = 28;
bmp->Height = 21;
bmp->Canvas->StretchDraw(bmp->Canvas->ClipRect, ImageOriginale->Picture->Bitmap);
tab_mini[k]->Picture->Bitmap = bmp;

 

Comment puis-je faire pour afficher mes images miniatures tout en utilisant le moins de mémoire possible ?

 

Merci beaucoup

 

 

Ps : une petite question au passage : il est devellopé en quel langage et avec quels outiles Zeb-Utility???

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Sujet intéressant. J'ai une solution mais elle est barbare. Toutefois, je pense qu'il est possible de la rendre acceptable du point de vue objet si tu en fais une classe bien étudiée.

 

L'idée de base est de charger l'image dans un seul TImage puis de copier le pointeur TPicture* Picture dans les autres TImage devant afficher la même image. Ce qui est très facile à faire si on ne pense que C :

 

int v1 = (int) Image1->Picture;
int* v2 = (int*) &(Image2->Picture);
*v2 = v1;

Ici le TImage* Image2 affichera la même image que le TImage* Image1.

 

Reste le problème des suppressions d'objets à la fin du programme. Tel quel, à la fermeture du programme, une exception est générée. Ceci en raison de l'objet commun Picture qui va être effacé deux fois, une fois pour Image1 et une autre pour Image2.

La parade consiste à placer les pointeurs contenant l'image dupliqué à NULL juste avant la fin du programme. Dans l'événement OnDestroy de la fenêtre par exemple :

 

*v2 = NULL;

 

Bien évidemment, une fois le principe acquis, il est préférable d'en faire un objet de duplication qui mémorise tout seul les pointeurs Picture dupliqués et les "nullifie" lors de sa destruction.

Lien vers le commentaire
Partager sur d’autres sites

En fait la copie ne me pose pas de pb, c'est juste le redimensionnement!

Ou alors je n'ai pas bien saisi la méthode que tu m'indique!

 

Merci quand meme!

517349[/snapback]

 

...je la charge une fois grandeur nature puis 12 fois en moyenne et 12 fois en mini ça fait beaucoup et d’ailleurs je retrouve ce phénomène en affichant les ressources mémoires consommé par l’application.

L'un de tes problèmes, si j'ai bien compris, c'est que tu veux utiliser plusieurs TImage pour afficher la même image simultanément mais avec des dimensions différentes.

 

La méthode que j'indique permet de disposer de plusieurs TImage avec la même image mais en partageant la zone où l'image est stockée, l'image n'est chargée qu'une seule fois. Pour chaque TImage, tu peux néanmoins préciser les dimensions d'affichage que tu veux.

 

Si tu charges plusieurs fois la même image dans des TImage différents, chacun d'entre eux utilise sa propre zone mémoire, ce qui ampute à chaque fois la mémoire vive.

 

Si ce n'est pas ce que tu veux faire, tu devrais peut être expliquer ce que doit faire cette partie de ton programme.

 

Par contre, je ne pense pas qu'il y ait de méthode simple et surtout universelle pour que la mémoire utilisée pour afficher une miniature soit significativement réduite (par rapport à l'affichage de l'image en taille réelle).

Lien vers le commentaire
Partager sur d’autres sites

La méthode que j'indique permet de disposer de plusieurs TImage avec la même image mais en partageant la zone où l'image est stockée, l'image n'est chargée qu'une seule fois. Pour chaque TImage, tu peux néanmoins préciser les dimensions d'affichage que tu veux.

 

En fait c'est bien ce que je veux faire! Desolé j'avais vu ton idée comme ça!

Je vais essayer merci beaucoup!

Lien vers le commentaire
Partager sur d’autres sites

salut,

 

bon en fait j'ai essayé avec ça :

 

int p1 = (int)(ImageTemp->Picture);
int *tab_p[12];

  for(int k = 0; k<12; k++) {
      tab_p[k]=(int *)&(TabImagePerso[k]->Picture);
 }

    for (int k = 0; k<12; k++) {
         if(strcmp(struct_page[k].ImageMere, "") != 0) {
            ImageTemp->Picture->LoadFromFile(&struct_page[k].ImageMere[0]);
            *tab_p[k]=p1;
         }
}

 

où TabImagePerso est un tableau de TImage.

 

Avec ça il me copie la meme image dans toutes mes images miniatures!

 

Et je vois pas d'où cela peut venir!

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

C'est exactement ce que tu as codé. La dernière image chargée est affichée par tous les TImage.

 

Lol, en fait je m'en suis rendu compte ce matin en me lavant lol (un peu comme doc qui decouvre le convecteur temporel en se heurtant la tete sur le chiotte dans retour vers le futur!)

 

Je pense avoir une idée de comment faire, je la test ce matin et je mets la méthode en ligne ce midi si ça marche!

 

Merci beaucoup pour ton aide!

Lien vers le commentaire
Partager sur d’autres sites

Je pense que tu as dû en nullifier trop ou pas assez (il faut laisser le pointeur original valide). Je ne vois d'autres problèmes liés à l'usage de cette technique.

 

Je n'aurais pas le temps de m'y pencher avant ce week-end. Si d'ici là tu n'as pas résolu ce problème, j'écrirais une classe toute simple qui fera la dupplication des Picture entre les TImage et qui se chargera de la nullification des pointeurs de façon automatique.

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...