Sauver une image picture box en bitmap sous le bon format [Fermé]

Messages postés
17
Date d'inscription
vendredi 31 octobre 2008
Dernière intervention
12 mai 2016
- - Dernière réponse : ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
- 12 mai 2016 à 13:11
Bonjour,

Quand je crée par exemple, une mire de barre dans une picture box avec une boucle ( i=1 à 400 e t j =1 à 200 , ) et que je la sauve en bitmap, j'obtiens une image .bmp avec un format double en "y" soit 400 x 400 pixels

J'ai fixé les paramètres de ma picturebox tels que
Picture1.AutoRedraw = True
Picture1.ScaleMode = 3
Picture1.ScaleHeight = 150
Picture1.ScaleWidth = 300
Picture1.Height = 200 >>> ressort en 400 sur l'image bmp crée
Picture1.Width = 400 >>> correspond à la demande de 400 px

Est-ce dû à un contrôle mal choisi ou un format imposé par bitmap ?

merci
Afficher la suite 

16 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
C'est quoi, une "mire de barre" ?
De toutes manières :
1) les dimensions que tu donnes pour l'affichage de ton image ne modifient en rien les propriétés de ton image !
2) ouvre ton aide VB6 à la rubrique PaintPicture. Seule cette méthode permet de modifier les dimensions de l'image (et pas celles de son affichage).
3) on ne voit pas dans le code que tu montres par quelle instruction tu sauvegardes le résultat. Je te rappelle à tout hasard que tu devras :
- soit attribuer la propriété image à la propriété Picture avant la sauvegarde
- soit sauvegarder directement la propriété image
Messages postés
17
Date d'inscription
vendredi 31 octobre 2008
Dernière intervention
12 mai 2016
0
Merci
Bonsoir,

Merci de ta réponse.

- Une mire est un outil sous forme de figure géométrique permettant de vérifier la résolution d'une optique, les performances en général d'un écran, d'un poste de télévision. Pour ceux qui connus cette époque la mire ORTF était diffusée en fin de programme pour vérifier la qualité de son poste TV et des images transmises . Une mire de barre est très simple, si les traits sont très rapprochés on ne les distingue plus, pas d'espoir de voir des détails à cette échelle.

- Je viens de voir la methode PaintPicture mais je comprend pas bien ce que je peux en tirer d'autant qu'il n'y a pas d'exemple. la methode indique : " Dessine le contenu d'un fichier graphique (.bmp, .wmf, .emf, .cur, .ico ou .dib) sur un objet Form, PictureBox ou Printer. Ne gère pas lesarguments nommés.".

- Mon code (que je peux joindre) comporte l'instruction " SavePicture Picture1.Image, "G:\Mes Documents W7\............\mire1.bmp" après le calcul "des barres".
Il en résulte la formation de cette image mire1.bmp dans le dossier choisi. Cette image n'est pas au bon format.
Je vois dans la methode en question des coordonnées x1y1, width1, height1 etc. est-ce que ce sont les paramètres correspondant au format de l'image ?
vb95
Messages postés
1724
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 décembre 2018
-
Bonsoir
A mon avis les paramètres x1y1, width1 et height1 sont le point XY origine de l'image bmp sauvegardée ainsi que sa largeur et sa hauteur
Plus de détails te seraient donnés avec l'aide de VB 6 ( sélectionne SavePicture puis F1 si l'aide est installée )
Messages postés
17
Date d'inscription
vendredi 31 octobre 2008
Dernière intervention
12 mai 2016
0
Merci
Bonsoir,

- C'est en accédant à l'aide VB6 que j'ai trouvé les infos sur la méthode PaintPicture ( conseil de ucfoutou).

- Save picture / aide VB6 : je ne trouve pas plus d'infos. Par ailleurs cette instruction fonctionne bien dans mon cas car comme je le disais, elle me crée bien mire1.bmp.
Je ne vois pas associé à savepicture d'arguments liés aux dimensions de l'image.

- Comme tu le dis," width1 et height1 sont le point XY origine de l'image bmp sauvegardée ainsi que sa largeur et sa hauteur " sont les paramètres qui figurent dans "la méthode" PaintPicture mais comment les utiliser si ce sont les bons ?
Quand je relis la méthode en question elle s'appliquerait à un dessin : "Dessine le contenu d'un fichier graphique (.bmp, .wmf etc. ". Moi mon dessin c'est une fonction que je calcule à l'aide de ce code :
...........................................................
For J = 1 To NLV
For i = 1 To NPL

If i < (NPL / 2) Then K = 128
If i > (NPL / 2) Then K = 255
NTeinte(i) = 255 + K * Sin(2 * Pi * i / 6)
Picture1.Line (i - 1, J - 1)-(i, J), RGB(NTeinte(i), NTeinte(i), NTeinte(i))

Next i
Next J


SavePicture Picture1.Image, "G:\Mes Documents W7\VB6\......................\mire1.bmp"

...............................................................

Ce code me permet bien de visualiser ma mire mais l'image mire1.bmp ne correspond pas à NLV x NLP ( nombre de lignes, nombre de points/ligne ) : de 400 x 200 on passe à 400 x 400!

Nota : MSDN donne en fait un exemple ( écrit en tout petit)concernant PaintPicture, incompréhensible pour moi...
vb95
Messages postés
1724
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 décembre 2018
-
Mille excuses : je voulais parlé de PaintPicture
Je suis en VB Net et ne fait plus du tout de VB 6 depuis longtemps mais il me reste encore quelques souvenirs de VB 6
Messages postés
17
Date d'inscription
vendredi 31 octobre 2008
Dernière intervention
12 mai 2016
0
Merci
Bonjour,

- Pas de problème vb95.

- J'ai simplifié mon code pour illustrer le problème dont le résultat est, comme déjà dit, une image de dimensions double en hauteur :

Private Sub Form_Load()

Dim NPL, NLV

NPL = 400 ' dimension mire
NLV = 200

Picture1.AutoRedraw = True
Picture1.ScaleMode = 3
Picture1.Height = 200
Picture1.Width = 400

' image NLV x NPL

For J = 1 To NLV
For i = 1 To NPL
Picture1.Line (i - 1, J - 1)-(i, J), RGB(255, 0, 0)
Next i
Next J

' sauver la MIRE en .bmp

'Picture1.Picture = Picture1.Image ' avec ou sans ne change rien

SavePicture Picture1.Image, "G:\Mes Documents W7\.........\mire.bmp"


End Sub
vb95
Messages postés
1724
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 décembre 2018
-
Salut
A tout hasard change cette ligne
Picture1.Line (i - 1, J - 1)-(i, J), RGB(255, 0, 0) 

par
Picture1.Line (i - 1, J )-(i, J), RGB(255, 0, 0) 


Le J-1 se transforme en J

Dans ton exemple tu traces une ligne entre le point i,j et le point i-1,j-1 donc une ligne oblique vers la droite
en traçant entre i,j et i-1,j on traces en horizontal entre deux points voisins et non pas en oblique entre deux points voisins
Je n'ai pas VB 6 donc impossible de tester
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Déjà : dessiner en touge, ligne par ligne, tous les pixels d'un rectangle, ce que fait ton:
For J = 1 To NLV
For i = 1 To NPL
Picture1.Line (i - 1, J - 1)-(i, J), RGB(255, 0, 0)
Next i
Next J

revient à dessiner un rectangle rouge et se fait ainsi
 Picture1.Line (0, 0)-(NLV, NPL), RGB(255, 0, 0), BF


je ne comprends ensuite pas ce que tu veux dire par :
J'ai simplifié mon code pour illustrer le problème dont le résultat est, comme déjà dit, une image de dimensions double en hauteur

tu as les dimensions que tu as décidé d'avoir !
Messages postés
17
Date d'inscription
vendredi 31 octobre 2008
Dernière intervention
12 mai 2016
0
Merci
Bonsoir,

- Déjà, le problème n'est pas là. Quand je construis ma mire j'ai besoin de ces boucles et j'ai voulu simplifier mon code mais apparemment sans succès.

- Je ne sais comment reformuler ce que j'ai déjà dit. Le petit code que j'ai fourni a pour résultat, dans le répertoire choisi , une image ( un rectangle rouge) dont les dimensions ne sont celles des boucles i et j. MediaInfo par exemple me le confirme.
Comme dit précédemment :"Ce code me permet bien de visualiser ma mire ( cette fois le rectangle rouge) mais l'image mire1.bmp ne correspond pas à NLV x NLP ( nombre de lignes, nombre de points/ligne ) : de 400 x 200 on passe à 400 x 400 "

Si ce que je dis n'est pas compréhensible dites moi de quelle façon je dois m'exprimer sinon j'abandonne.

VB95 : c'est vrai mais pour le tracé du rectangle (rouge) ça ne fait pas de différence.
vb95
Messages postés
1724
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 décembre 2018
-
Après réflexion il est vrai que ma modification n'aurait jamais pu solutionner ton problème car au début j'avais pensé à un dédoublement des lignes vu le j et j -1 mais vu que la prochain était j-2 et j-1 cela ne dédouble nullement le nombre de lignes
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Je ne sais comment reformuler ce que j'ai déjà dit.

Ben ... peut-être en le disant en langage naturel, sans code :
1) j'ai une picturebox Picture1 avec telles propriétés : les dire
2) j'y dessine ceci ou j'y mets cela (à exposer)
3) je veux sauvegarde le résultat (si modifié : avec quelles modifications ?) dans un fichier .bmp
Pas compliqué à exprimer, non ?
Messages postés
17
Date d'inscription
vendredi 31 octobre 2008
Dernière intervention
12 mai 2016
0
Merci
- Merci de me donner ces conseils mais n'étant pas spécialiste de cette discipline je ne m'exprime pas de cette façon.
Ce que tu dis maintenant, tu aurais pu peut-être me le dire dès le départ plutôt que de m'orienter vers Paintpicture chose que j'ai faite pour rien puisque tu n'as toujours compris le problème.

- Tu m'a demandé " on ne voit pas dans le code que tu montres par quelle instruction tu sauvegardes le résultat" j'ai fourni un code simplifié et tout ce que tu trouves à dire est comment on trace un rectangle rouge. Quel lien avec mon problème ?

- Manifestement ton intérêt pour me fournir une aide est très limité et de plus tes réflexions ,dont la dernière "Pas compliqué à exprimer, non ? " me font penser rétrospectivement aux petits profs imbus de leur personne que chacun a pu croiser dans sa vie scolaire, j'ai passé l'âge...

- Alors tu fais avec ce que j'ai exprimé dans mon langage ou bien tant pis ce n'est pas grave tu n'es pas le seul et je trouverais bien quelqu'un à l'écoute des autres... Exemple Vb95 ( remets toi stp au VB6 ! )
Messages postés
1724
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 décembre 2018
0
Merci
Désolé mais je ne me remettrai point au VB 6 ( langage obsolète vu la puissance des langages Net ) bien quà l'époque VB 6 était déjà un très bon langage et que d'excellents programmes ont été faits avec ! J'ai commencé avec VB 4 moi
Maintenant chacun essaie de faire au mieux pour t'aider et ce n'est pas en montant sur tes grands chevaux que cela va se solutionner ! Si tu savais le nombre de personnes que notre ami ucfoutu a dépanné de façon efficace tu en tomberais des nues !
Bon revenons calmement à nos moutons. tu as écrit ceci :
Comme dit précédemment :"Ce code me permet bien de visualiser ma mire ( cette fois le rectangle rouge) mais l'image mire1.bmp ne correspond pas à NLV x NLP ( nombre de lignes, nombre de points/ligne ) : de 400 x 200 on passe à 400 x 400 "
Tu visualises ta mire avec ce code et est-elle correcte en taille sur la Form ? Maintenant si tu visualises le mire1.bmp (c'est-à-dire le fichier sauvegardé) avec un logiciel de visualisation d'image est-il doublé en hauteur ?
A tout hasard intéresses-toi à la propriété SizeMode de la picturebox et mets la de façon que l'image se cale sur les dimensions de la picturebox : ça doit être Strechtmode ou quelque chose comme cela !

C'est StretchImage : l'image contenue dans la PictureBox est étirée ou rétrécie pour correspondre à la taille de la PictureBox.
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Tu voudras bien m'excuser, Chesterylb, mais je me suis quand même fendu de ce test , avec 3 picturebox sur mon Form :
Private Sub Form_Load()
Dim NPL, NLV

NPL = 400 ' dimension mire
NLV = 200

Picture1.AutoRedraw = True
Picture1.ScaleMode = 3
Picture1.Height = 200
Picture1.Width = 400
Picture2.AutoRedraw = True
Picture2.ScaleMode = 3
Picture2.Height = 200
Picture2.Width = 400

Picture3.AutoRedraw = True
Picture3.ScaleMode = 3
Picture3.AutoSize = True ' comme cela je verrai exactement la taille de ce que j'ai dans le fichier bmp sauvegardé


'For J = 1 To NLV
'For i = 1 To NPL
'Picture1.Line (i - 1, J - 1)-(i, J), RGB(255, 0, 0)
'Next i
'Next J
Picture1.Line (0, 0)-(NLV, NPL), RGB(255, 0, 0), BF
SavePicture Picture1.Image, "d:\monimage.bmp"

Picture2.PaintPicture Picture1.Image, 0, 0, Picture2.Width, Picture2.Height * 2

Picture3.Picture = LoadPicture("d:\monimage.bmp")
MsgBox Picture3.Height & vbCrLf & Picture3.Width
MsgBox Picture1.Height & vbCrLf & Picture1.Width
MsgBox Picture2.Height & vbCrLf & Picture2.Width
End Sub


Et il se trouve que, que ce soit avec mon code pour dessiner ou le tien (que j'ai mis en commentaires), que j'utilise ou non paintpicture, comme je le montre ici, etc ... mes 3 images ont bel et bien les mêmes dimensions (celle sauvegardée également).
Si donc tel n'est pas le cas chez toi (et donc y compris avec le code de ton tout premier message) :
- ou il y a un mystère
- ou tu as mal exprimé le but (raison de mes questions)

Alors : ou tu donnes ces explications, ou je te laisse tomber


A VB95 : non, pas de propriété StretchImage pour une picturebox VB6.



Messages postés
17
Date d'inscription
vendredi 31 octobre 2008
Dernière intervention
12 mai 2016
0
Merci
Bonsoir,

- Je te remercie pour tes excuses, que je prendrais au sens large (!), mais de grâce un peu moins d'agressivité dans ta façon de répondre c'est quand même un forum d'entraide pour spécialistes chevronnés certes mais aussi pour débutants ...

-Tu vois tu recommences : "ou tu donnes ces explications, ou je te laisse tomber" Comme tu ne me laisses pas le choix je te dis tout parce que moi aussi j'ai continué de faire des manip, vb95 m'ayant mis la puce à l'oreille avec " Tu visualises ta mire avec ce code et est-elle correcte en taille sur la Form ?"et la réponse est non, même Pb.

En deux mots, J'ai modifié "scale mode" et/ou " scale height" de la form1 qui recueille ma picturebox1 ce qui résout mon problème ( hauteur d'image double) :
- au départ scale mode= 0-user et scale height ~500 je crois
- si scale mode =pixel ça marche, plus de Pb
- si scale height = 800 avec scale mode =0-user ça marche aussi.

Dans les 2 cas, la form1 présente une image 200x400 ainsi que l'image bmp formée.

Je pensais, manifestement à tort, qu'il fallait que ma picturebox ait les bons paramètres mais ce sont ceux de la form1 qui comptent en premier. Si tu as un moment merci d'expliquer pourquoi, je ne comprend pas la logique.
vb95
Messages postés
1724
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
9 décembre 2018
-
Bonsoir Chesterylb
Si le problème est résolu tant mieux !
Je n'ai pas d'explication pour ce que tu dis ici :Je pensais, manifestement à tort, qu'il fallait que ma picturebox ait les bons paramètres mais ce sont ceux de la form1 qui comptent en premier. Si tu as un moment merci d'expliquer pourquoi, je ne comprend pas la logique.
Penses à mettre le sujet en Résolu si c'est le cas
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Je te prie, Chesterylb de relire ton message n° 6 (du 11 mai 2016 à 12:30) par lequel tu nous montres le code dont tu affirmes qu'il conduit au problème que tu exposais en précisant très exactement :
citation :
J'ai simplifié mon code pour illustrer le problème dont le résultat est, comme déjà dit, une image de dimensions double en hauteur
:
Tu n'y touches que le scalemode (en le mettant à 3, pour vbpixels) et en aucun cas ni le scaleheight, ni le scaleWidth.
Avec ce code (dont tu affirmais pourtant qu'il conduisait à un resultat inattendu), on se retrouve forcément en scalemode 3 (pixels) et ce : même si des manoeuvres en création avaient pu établir un scalemode différent.
C'est de CE CODE, que je suis donc parti. Pardi : puisque tu affirmais que CE code provoquait ton problème !
Et il se trouvait que non (mes tests).
Conclusion : tu nous a fait réfléchir et travailler sur la base d'un code qui n'était pas celui que tu avais testé !
Etonne-toi ensuite des remarques !
Bref ...

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Pour répondre maintenant à ton interrogation en ce qui concerne la modification des paramètres scalewidth et scaleheight de ton Form.
1) ils entraînent un passage automatique en scalemode 0 (user).
2) les valeurs que tu y mets représentent des unités qui seront utilisées pour les dimensions de tout ce qui sera dessiné sur ton form
3) si tu ne donnes pas à ces propriétés les proportions de ta picturebox, tu modifies celles de la picturebox.
4) il te faut par ailleurs comprendre la différence existant entre les dimensions données à une picturebox sur un form et les dimensions de l'image qu'elle peut abriter. Ce sont des choses distinctes.

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Et pour le vérifier et comprendre en même temps la différence fondamentale entre les propriétés Picture et Image d'une picturebox, rien de mieux que ce petit test très parlant :
sur un form :
un bouton de commande
une picturebox picture1 de taille inférieure à l'image à y injecter par loadpicture
2 pictureboxes picture2 et picture3 de taille plus importante
et ce code :
Private Sub Command1_Click()
Picture2.Picture = Picture1.Picture
Picture3.Picture = Picture1.Image
End Sub


qui te permet de constater :
- que le contenu d'une picturebox peut être de taille supérieure à celle de son contenant (la picturebox)
- la différence entre les propriétés image et picture d'une picturebox
Messages postés
17
Date d'inscription
vendredi 31 octobre 2008
Dernière intervention
12 mai 2016
0
Merci
Bonjour,

- Je ne comprend rien quand tu dis que je t'ai pas fourni le code qui va bien etc.etc.
En recopiant ce même code ( message n°6 ) j'ai recrée un autre projet pour vérifier et je trouve les résultats suivants :

1/ Si scalemode de la form1 et de la picturebox sont = twip ( par exemple) pas de résultat : image 3x9 twip sur form1 et bitmap de 23x9 pixels.

2/ Si scalemode de la form1 =twip scalemode picturebox = pixel, sur la form1 j'ai une toute petite image de 3x9 twip et une image bitmap de 400x200 pixels correcte.

3/Si scalemode de la form1 =pixel et scalemode picturebox = twip (again) alors le résultat est correct sur la form1 et l'image bitmap est bien de 400x200

Donc :
a/ je t'ai bien fourni le code correspondant avec les mauvais résultats sauf que je ne t'avais pas dit que les scalemode form1 et picturebox n'étaient pas dans la bonne unité et pour une bonne raison : c'est bien là qu'était le problème de base .

b/ J'ai, je crois, maintenant bien compris "la différence fondamentale entre les propriétés Picture et Image d'une picturebox" et pour moi la seule chose qui donne de bons résultats est de bien renseigner l'unité de la scalemode de la form avant celle de la picturebox ( en tous cas pour mon application).

- Ces conclusions, il me semble, correspondent à sont celles de ton avant dernier message. J'ai joint un tableau récapitulatif de mes derniers essais, j'espère que ça passera ( image jpeg 100ko)


- Pour en finir :comprends moi bien, si j'ai un problème je l'expose le mieux que je peux, seulement tes réflexions du genre "Conclusion : tu nous a fait réfléchir et travailler sur la base d'un code qui n'était pas celui que tu avais testé ! Etonne-toi ensuite des remarques ! tu te les gardes pour toi et tu mets un mouchoir dessus.
Le fait d'être compétent dans ton domaine ne te donne aucun droit de traiter les gens comme tu le fais et ce depuis le début. Désolé mais si en général les gens s'écrasent et tolèrent tes écarts de langage ( pour ne pas dire tes abus) ça les regarde, mais dans l'esprit de ce forum d'aide à tous je ne trouve pas ça correct.
Si il y a un modérateur dans ce forum son avis m'intéresse...


PS : je ne vois pas l'image du tableau ?
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Cela tombe bien : Modérateur, je le suis.
Et donc : je ferme cette discussion, sans aucun état d'âme.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.