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 :

impossibilité de créer des objet TBitmap de grande taille en BC++Builder


Sujet :

C++Builder

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 24
    Par défaut impossibilité de créer des objet TBitmap de grande taille en BC++Builder
    bonjour,
    quand je crée un objet TBitmap de grande taille (width =8000 et height = 7une vintaine de mégaOctets.000) le code se compile correctement mais à l'exécution le code plane sur la seconde affectation de taille (ex la largeur ça passe, mais ensuite la hauteur ne passe plus et inversement).
    La doc dit que la mémoire est affectée dans le tas (et je dispose de largement assez de mémoire pour y prendre une vingtaine de mégaO.
    Je peux bien sûr initialiser une image de grande taille, mais cela rend la taille du code excessive.
    pour info, j'utilise le bitmap pour y tracer des courbes que j'imprimerai ensuite gâce à Draw(x,y,z) par ex, cela pour éviter des problèmes d'impression quand on trace directement dans le Canvas de l'imprimante.
    Si quelqu'un avait une idée cela m'aiderait bien

    bonne journée
    amicalement
    Daniel

  2. #2
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Il va falloir mettre un peu de code, car je n'ai pas de problème avec ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Graphics::TBitmap *MyBitmap = new Graphics::TBitmap;
        MyBitmap->SetSize(8000, 7);
        /**  ICI ON FAIT QQCHOSE AVEC LE BITMAP **/
        for(int y=0; y<MyBitmap->Height; y++)
        {
            for(int x=0; x<MyBitmap->Width; x++)
            {
                MyBitmap->Canvas->Pixels[x][y] = clRed;
            }
        }
        MyBitmap->SaveToFile("Temp.bmp");
        /**  ICI ON FINI DE FAIRE QQCHOSE AVEC LE BITMAP **/
        delete MyBitmap;
    Dans mon test, le code est même très mauvais car j'affecte chaque pixel directement au lieu de d'utiliser ScanLine. En plus, j'accède au disque dur pour enregistrer une image de 218 Ko. Et tout ça se fait très rapidement.

  3. #3
    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 !

    (width =8000 et height = 7une vintaine de mégaOctets.000)
    Ca doit être plutôt :

    width =8000 et height = 7000 (une vintaine de mégaOctets)
    Donc une vingtaine de Mo signifie probablement qu'il est en basse résolution (Bitmap->PixelFormat = pf4bit), en 16 couleurs !

    Donc il faudrait par exemple appliquer un zoom / 4, dessiner, puis faire un StretchDraw sur une surface * 4 (coté printer).
    Le Stretch devrait être pas trop mal !
    A tester !
    A plus !

  4. #4
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    henderson, j'avais pas vue qu'il y avait une erreur de copier/coller dans le texte de dgkourou.

    Maintenant quand j'utilise ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        MyBitmap->SetSize(8000, 7000);
    J'obtient cette erreur sur XP en anglais au démarrage du programme:
    Not enough storage is available to process this command.
    Et sur XP en français:
    Espace insuffisant pour traiter cette commande.

  5. #5
    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 dgkourou
    Il me semble avoir lu quelque part que le fait de redefinir le Type de Bitmap soit en DDB (Device Dependent Bitmap : bitmap dépendant du périphérique) ou en DIB (Device Independent Bitmap : bitmap indépendant du périphérique) permettait de resoudre le probleme de memoire insuffisante

  6. #6
    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
    As-tu essayé de modifier les options du projet: dans la partie du "linker" (j'ai une version anglaise), il y une section "Output Options" où on peut déterminer la taille minimale et maximale du heap...

  7. #7
    Membre Expert
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Par défaut
    Salut, j'ai réussi à faire fonctionner mon code. Par défaut lorsque l'on crée un objet TBitmap il possède la valeur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        MyBitmap->PixelFormat = pfDevice;
    Par contre, quand on la met qqchose d'autre comme pf24bit par exemple, je n'ai pas de problème.

    Alors voici mon code qui génère un fichier bitmap de 160Mo avec un gros rectangle rouge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Graphics::TBitmap *MyBitmap = new Graphics::TBitmap;
        MyBitmap->PixelFormat = pf24bit;
        MyBitmap->SetSize(8000, 7000);
        /**  ICI ON FAIT QQCHOSE AVEC LE BITMAP **/
        for(int y=0; y<MyBitmap->Height; y++)
        {
            for(int x=0; x<MyBitmap->Width; x++)
            {
                MyBitmap->Canvas->Pixels[x][y] = clRed;
            }
        }
        MyBitmap->SaveToFile("Temp.bmp");
        /**  ICI ON FINI DE FAIRE QQCHOSE AVEC LE BITMAP **/
        delete MyBitmap;

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

Discussions similaires

  1. créer des objets "User" personalisés
    Par watcha2020 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 29/04/2007, 01h48
  2. Réponses: 2
    Dernier message: 05/02/2007, 09h12
  3. Travailler / Créer des objets complexes
    Par Ekinoks dans le forum OpenGL
    Réponses: 3
    Dernier message: 22/08/2005, 14h38
  4. [C#] Créer des objets Winform personnalisés
    Par KibitO dans le forum Windows Forms
    Réponses: 8
    Dernier message: 31/05/2005, 17h09
  5. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47

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