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

Lazarus Pascal Discussion :

Taille maximale d'une image


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 059
    Par défaut Taille maximale d'une image
    Bonjour,

    Sous Delphi pour un besoin très spécifique, en désactivant Direct2D, je peux créer à l'écran des images de 32768 X 16384 pixels.

    J'aurais aimé savoir s'il est possible de faire la même chose sous Lazarus ?

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 123
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 123
    Par défaut
    Salut
    Citation Envoyé par der§en Voir le message
    j'aurais aimé savoir, s'il est possible de faire la même chose sous Lazarus ?
    Ben, surement, oui, et même plus !
    Width et Height sont des integer, donc limite max 2 147 483 648 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TMainForm.btn4TestsClick(Sender: TObject);
    var
      b: TBitmap;
    begin
      b := TBitmap.Create;
      b.PixelFormat := pf32bit;
      b.Width := 2147483648;
      b.Height:= 2147483648;
    end;
    Bon, je n'avais rien sous la main pour remplir avec des datas et afficher, mais ça a compilé et pas vu de problèmes au clic sur le bouton (le reste du prog est opérationnel sans soucis après le clic).

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Avec ce 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 TForm1.Button1Click(Sender: TObject);
    var
      b: TBitmap;
    begin
      b := TBitmap.Create;
      b.PixelFormat := pf32bit;
      b.SetSize(32768, 16384);
      b.Canvas.Brush.Color:=clLime;
      b.Canvas.Rectangle(0, 0, 32768, 16384);
      b.SaveToFile('c:\UserFiles\test.bmp');
      Image1.Picture.LoadFromFile('c:\UserFiles\test.bmp');
      b.Free;
    end;
    j'ai réussi à créer et enregistrer un fichier Bitmap de 2 Go, mais ai gagné une EOutOfMemoryException en cherchant à l'ouvrir...

    [EDIT] quant à la taille du Bitmap de JP, rien que d'y penser, ma mémoire grille !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre chevronné Avatar de der§en
    Homme Profil pro
    Bretagne
    Inscrit en
    Septembre 2005
    Messages
    1 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bretagne
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 059
    Par défaut
    Merci de vos remarques, j'ai juste besoin de pouvoir la créer et la sauver dans un fichier

    sinon, doit-on en déduire que nativement Lazarus, n'utilise pas les optimisations de Direct2D ?

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 15
    Par défaut
    Bonjour,
    Le problème sera en effet lié à la gestion de la consommation mémoire.
    A ce propos, je me permets 2 remarques :
    - Il est préférable de relacher la mémoire AVANT de charger l'image crée
    - attention aux dimensions : le rectangle dessiné dépasse d'1 pixel la taille de l'image réservée (32768 pixels -> commence à 0 et fini à 32767)
    Il ne sert à rien de dessiner 32768 pixels de trop...

    Ma proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button1Click(Sender: TObject);
    var
      b: TBitmap;
    begin
      b := TBitmap.Create;
      b.PixelFormat := pf32bit;
      b.SetSize(32768, 16384);
      b.Canvas.Brush.Color:=clLime;
      b.Canvas.Rectangle(0, 0, 32767, 16383); // j'ai réduit de 1 pixel (sur 2 axes) pour être conforme à la déclaration de taille ci-avant
      b.SaveToFile('test.bmp');
      b.Free;  // on relache la mémoire avant le chargement de l'image
     
      Image1.Picture.LoadFromFile('test.bmp');
    end;
    Il faut moins de mémoire pour exécuter ce code, et on évite d'écrire au delà des limites ;-)
    ludo

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 123
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 123
    Par défaut
    Citation Envoyé par Ludelphi7 Voir le message
    - attention aux dimensions : le rectangle dessiné dépasse d'1 pixel la taille de l'image réservée (32768 pixels -> commence à 0 et fini à 32767)
    Il ne sert à rien de dessiner 32768 pixels de trop...

    Ma proposition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      b.Canvas.Rectangle(0, 0, 32767, 16383); // j'ai réduit de 1 pixel (sur 2 axes) pour être conforme à la déclaration de taille ci-avant
    Oui, sauf qu'il y a un tuto qui montre bien que les dév's Laz' ne font pas comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      Bmp := TBitmap.Create;
      Bmp.Width := 10;
      Bmp.Height := 10;
      Bmp.Canvas.Pen.Color := clYellow;
      Bmp.Canvas.Brush.Color := clYellow;
      Bmp.Canvas.Rectangle(0, 0, 10, 10);
    Flemme de faire des tests...
    Pi il me semble avoir lu un jour quelque part (et bien sûr je ne le retrouve pas...) que les 2 premiers nombres représentent des coordonnées, quand les deux suivants représentent des longueurs, donc méfiance !

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      b.Width := 2147483648;
      b.Height:= 2147483648;
    Citation Envoyé par jipété
    Et pourquoi donc ? La machine devrait swapper dans le pagefile.sys (pour Windows) mais devrait y arriver, non ?
    Ben, un petit bitmap de maxint au carré en pf32bit, ça nous fait à peine 16,8 millions de To (2G*2G*4o), un peu au delà de mon pagefile.sys...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 71
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Pi il me semble avoir lu un jour quelque part (et bien sûr je ne le retrouve pas...) que les 2 premiers nombres représentent des coordonnées, quand les deux suivants représentent des longueurs, donc méfiance !
    Bonjour.

    Je confirme que pour l'avoir testé il y a deux jours qu'en supprimant un pixel on a un joli liseré sur les bords droits et bas en mettant deux couples de coordonnées plutôt que l'origine et les dimensions.
    Peut-être un problème de surcharge de routine ?


    Je profite de la réponse pour poser une question.
    J'ai un TImage dans un TPanel dans un TScrollBox. En voulant étendre la dimension de l'image celle-ci ne change pas alors que le TPanel S'adapte bien et la TScrollBox aussi. En réduisant la taille cela marche correctement. Tout se passe comme si je ne pouvais pas dépasser les dimensions initiales pourtant aussi fixées par programmation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        FTailleFeuille.fixeForm(largeurFond,hauteurFond);
        if (FTailleFeuille.ShowModal=MrOk) then
          begin
            FTailleFeuille.changeProprietes(largeurFond,hauteurFond);
            FondReleve.Width:=largeurFond;
            FondReleve.Height:=hauteurFond;
            FondReleve.Color:=clred;
            Image1.Width:=largeurFond;
            Image1.Height:=hauteurFond;
            TReleve(projet.releves[projet.releveCourant-1]).haut:=hauteurFond;
            TReleve(projet.releves[projet.releveCourant-1]).larg:=largeurFond;
            dessine_grille(Image1.Canvas,Image1.Width,Image1.Height);
        end;
    Si le formulaire retourne des dimensions plus grandes qu'à l'origine, le TPanel FondReleve apparaît bien non recouvert de l'image (en rouge) et la grille dessinée ne couvre que la partie non rouge du TImage.


    Après des tests supplémentaires la solution que j'ai trouvée est d'associer l'image à un nouveau TBitmap de la taille requise. Étrange puisque je ne le fais pas au premier redimensionnement.

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 123
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 123
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      b.SetSize(32768, 16384);
    Ah Yves, t'as pas tout bien suivi (tu es excusé, c'est confus et touffu) : j'ai écrit en son temps
    Me suis rendu compte qu'une instruction que j'utilisais souvent, Bitmap.SetSize(aWidth, aHeight); sous son air anodin et évident, est une brave cochonnerie qui fait des copies des données ! Pourquoi ? J'ai lu dans le code // for delphi compatibility copy old image !
    Ah !
    Parce que dans mon vieux D7 SetSize n'existe pas...

    On y trouve aussi ça : // use slow copy of pixeldata till rawimage can also copy to larger destination et bien sûr l'aide toujours indigente n'en dit pas un mot...

    Bref, suis repassé à Bitmap.Width et Bitmap.Height, dommage...
    Citation Envoyé par tourlourou Voir le message
    [EDIT] quant à la taille du Bitmap de JP, rien que d'y penser, ma mémoire grille !
    Et pourquoi donc ? La machine devrait swapper dans le pagefile.sys (pour Windows) mais devrait y arriver, non ?


    Citation Envoyé par tourlourou Voir le message
    j'ai réussi à créer et enregistrer un fichier Bitmap de 2 Go, mais ai gagné une EOutOfMemoryException en cherchant à l'ouvrir...
    Et pourquoi donc ? Faudrait creuser en pas-à-pas pour savoir ce qui se passe dans les profondeurs...

    Quant à moi, sous Linux Debian 7 / 32 bits, c'est un poème (45 000 x 45 000 = 2 025 000 000) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      b := TBitmap.Create;
      b.PixelFormat:=pf32bit;
      b.Width :=45000;
      b.Height:=45000;
      b.Canvas.Brush.Color:=clLime;
      b.Canvas.Rectangle(0, 0, 44999, 44999); // run error 204
    //alors j'essaye
      b.Canvas.Rectangle(0, 0, 45000, 45000); // run error 204
    //alors j'essaye sans Rectangle, et bim ! quand même...
      b.SaveToFile('/tmp/test.bmp'); // run error 204
    Bienvenue dans le monde merveilleux du graphisme sous Lazarus ! Pas trop le temps ni l'envie de dépatouiller cette vérole, car il me suffit d'enlever un zéro à la largeur et un zéro à la hauteur pour que ça fonctionne...
    Mais pas en "remontant" aux valeurs demandées par Der§en :
    Nom : erreur_fpe.png
Affichages : 805
Taille : 15,4 Ko
    Ça me gave, si vous saviez comme ça me gave et me bassine...


    Citation Envoyé par der§en Voir le message
    sinon, doit-on en déduire que nativement Lazarus, n'utilise pas les optimisations de Direct2D ?
    De quoi parle-tu ?

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 123
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 123
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Avec ce 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 TForm1.Button1Click(Sender: TObject);
    var
      b: TBitmap;
    begin
      b := TBitmap.Create;
      b.PixelFormat := pf32bit;
      b.SetSize(32768, 16384);
      b.Canvas.Brush.Color:=clLime;
      b.Canvas.Rectangle(0, 0, 32768, 16384);
      b.SaveToFile('c:\UserFiles\test.bmp');
      Image1.Picture.LoadFromFile('c:\UserFiles\test.bmp');
      b.Free;
    end;
    j'ai réussi à créer et enregistrer un fichier Bitmap de 2 Go, mais ai gagné une EOutOfMemoryException en cherchant à l'ouvrir...
    Et moi avec ces dimensions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      b.Width := 8000;
      b.Height:= 8000;
    j'arrive à générer un fichier de 256 Mo qui s'ouvre sans problème avec le visionneur de fichiers de Linux tout comme avec The Gimp mais une tentative avec Lazarus (TBitmap, TPicture, TImage) se solde par un délog/relog violent de la session, alors méfiance !

Discussions similaires

  1. [HTML 5] Taille maximal d'une image
    Par Stefan0 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/11/2011, 17h01
  2. Fixer la taille maxi d'une image
    Par franck.thibault dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 14/08/2006, 13h00
  3. récupérer la taille totale d'une image avant chargement
    Par sorenson dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/06/2006, 14h50
  4. Taille max d'une image
    Par Risike dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/05/2006, 17h16
  5. Taille maximal d'une chaine de caractère...
    Par nguthans dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2006, 16h58

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