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 ?
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 ?
Salut
Ben, surement, oui, et même plus !
Width et Height sont des integer, donc limite max 2 147 483 648 :
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).
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;
Bonjour,
Avec ce code :
j'ai réussi à créer et enregistrer un fichier Bitmap de 2 Go, mais ai gagné une EOutOfMemoryException en cherchant à l'ouvrir...
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;
[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 !
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 ?
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 :
Il faut moins de mémoire pour exécuter ce code, et on évite d'écrire au delà des limites ;-)
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;
ludo
Oui, sauf qu'il y a un tuto qui montre bien que les dév's Laz' ne font pas comme ça :
Flemme de faire des tests...
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);
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 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 b.Width := 2147483648; b.Height:= 2147483648;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...Envoyé par jipété
![]()
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 !
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.
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.
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;
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.
Ah Yves, t'as pas tout bien suivi (tu es excusé, c'est confus et touffu) : j'ai écrit en son tempsEt pourquoi donc ? La machine devrait swapper dans le pagefile.sys (pour Windows) mais devrait y arriver, non ?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...
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) :
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...
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
Mais pas en "remontant" aux valeurs demandées par Der§en :
Ça me gave, si vous saviez comme ça me gave et me bassine...
De quoi parle-tu ?
Et moi avec ces dimensionsj'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 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 b.Width := 8000; b.Height:= 8000;![]()
Partager