Impression d'une Photo (Jpg) au format 10x15

Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017 - Modifié par noctambule28 le 18/11/2013 à 18:24
 cjvg - 24 nov. 2013 à 09:40
Bonjour,

J'ai développé un logiciel qui affiche et imprime des photos. L'impression se fait en sélectionnant la photo par un simple clique.
Cette procédure fonctionne correctement sur mon imprimante mais, pose problème sur une imprimante CANNON MG7150.

Le papier photo utilisé est d'un format 10 x 15. A la sortie de l'imprimante, l'image qui devrait être imprimée sur la totalité du papier est tronquée et présente les marges suivantes:
- Gauche: 2 Mm - Droite: 32 Mm - Haute: 10 Mm - Basse: 10 Mm.

----------------------------------------------------------------------------------

Public Sub OnImprime0(Parm1 As Image)

Printer.Orientation = 1
If Parm1.Width > Parm1.Height Then Printer.Orientation = 2

Printer.PrintQuality = vbPRPQHigh
Printer.Print "";
Printer.Copies = 1

Printer.ScaleMode = 7 'centimetres
TAILLEPAPIERLONG = 15
TAILLEPAPIERHAUT = 10
                                                                
Printer.PaperSize = vbPRPSUser
Printer.Width = TAILLEPAPIERLONG
Printer.Height = TAILLEPAPIERHAUT
 
Printer.PaintPicture Parm1,0,0, TAILLEPAPIERLONG, TAILLEPAPIERHAUT 
Printer.EndDoc
End Sub

'---------------------------------------------------------------------------------

Avez vous une idée sur le correctif à apporter à cette procédure afin qu'elle imprime correctement mes photos

Par avance merci
P

35 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 nov. 2013 à 17:09
Bonjour,
Quel est le scalemode de la picturebox Et quelles en sont les dimensions dans l'unité de ce scalemode ?
0
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
18 nov. 2013 à 17:33
Bonjour Mr Ucfoutu,

J'ai peur de ne pas répondre à la question que vous me posez.

- La photo est chargée dans un composant Image (Stretch = true)
- La form est caractérisée par un scalemode = 1

Désolé pour cette réponse.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 18/11/2013 à 18:13
1) PaintPicture ne va pas travailler avec l'image telle qu'elle apparaît ("stretchée") dans ton contrôle image, mais avec l'image elle-même (avec ses dimensions réelles)
2) tu ne peux à la fois vouloir occuper toute la feuille et omettre les marges par défaut de l'imprimante. Si cette imprimante-là n'est pas prévue pour pouvoir imprimer "bord à bord" (donc sans aucune marge) tu ne peux y envoyer en étirement sur toute la surface de la feuille d'impression l'image à imprimer.
Facile à régler (suffit de déduire les marges)
Mais il y a beaucoup plus gênant :
3) en imposant un étirement basé sur des dimensions fixes; comme tu le fais, l'image imprimée subira une distorsion (sauf si, par miracle, les proportions de l'image (je parle de l'image d'origine et non de son apparence dans le contrôle image, comme dit en 1)) sont très exactement les mêmes que celles de la surface imprimable de la feuille d'impression !
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 nov. 2013 à 18:43
Je te précise que si tu veux que ton impression respecte les proportions de ton image tout en occupant la surface d'impression maximum de ta feuille, il te faut faire quelques calculs arithmétiques précis, sur la base des dimensions réelles de l'image insérée dans ton contrôle image. Il te faudra par ailleurs inclure dans ces calculs les fonctions scalex et scaley de vb6
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
18 nov. 2013 à 19:23
J'ai lu plusieurs fois vos explications pour essayer de comprendre et surtout trouver une solution pour modifier ma procédure.

J'ai lancé une impression avec paintpicture ce qui m'a permis de constater que la photo occupais toute la surface du papier tout en respectant ses proportions.

J'en déduis que techniquement c'est possible, mais encore faut-il traduire cela en instructions VB6.

A ce stade, je ne vois pas comment modifier ma procédure pour obtenir le même résultat.

Merci encore pour votre support.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 18/11/2013 à 19:39
J'insiste : si les proportions ont été gardées, cela signifie que par pur hasard, les proportions de la feuille d'impression étaient les même que celles de l'image originelle ! Il ne saurait y avoir une autre explication...
Amuse-toi (je te tutoie et souhaite que tu en fasses autant et cesses de m'appeler "Mr" ... cela me vieillit ...) à envoyer cette image en impression sur une feuille dont les proportions sont très éloignées de celle de l'image (de sorte à ce que la distorsion soit repérée à l'oeil nu) et tu vas avoir l'occasion de constater la justesse de ce que je te dis !

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 18/11/2013 à 20:02
Et je vais t'en donner la preuve (écrite vite fait bien fait) :
Sur ton form : 1 bouton de commande command1, une image image1, une picturebox picture1 et une picturebox picture2.
Mets dans image1 l'image de ton choix ===>> lance ce code:
Private Sub Command1_Click()
  Dim toto As Integer, titi1 As Integer, titi2 As Integer
  Picture1.ScaleMode = 7
  Picture2.ScaleMode = 7
  Picture1.ScaleWidth = 6
  Picture1.ScaleHeight = 3
  Picture1.ScaleWidth = 8
  Picture1.ScaleHeight = 2
  Picture1.PaintPicture Image1, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight
  Picture2.PaintPicture Image1, 0, 0, Picture2.ScaleWidth, Picture2.ScaleHeight
End Sub

Constate que les proportions du résultat sont différentes entre les 2 pictureboxes ...
Le résultat serait le même avec l'objet Printer, qui réagit très exactement comme une picturebox.

Tu le vois bien ===>> la distorsion est celle de l'objet de destination (ici, une picturebox, là un objet Printer...)
Pour corriger tout cela : il te faut user d'arithmétique.
Comment ferais-tu ce calcul arithmétique avec un papier et un crayon (hors informatique, donc) ?
La solution arithmétique "sur papier et avec crayon" est ta réponse, à traduire ensuite en opérations VB.




________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 nov. 2013 à 20:20
Ouais... J'ai écrit à presque main levée et les choses ne sont pour le coup pas forcément très claires ===>> On change donc de démo :
Private Sub Command1_Click()
  Me.ScaleMode = 7
  Picture1.ScaleMode = 7
  Picture2.ScaleMode = 7
  Picture1.Width = 6
  Picture1.Height = 6
  Picture2.Width = 8
  Picture2.Height = 2
  Picture1.PaintPicture Image1, 0, 0, Picture1.Width, Picture1.Height
  Picture2.PaintPicture Image1, 0, 0, Picture2.Width, Picture2.Height
End Sub

j'ai ici mis toutes les échelles en centimètres pour t'éviter de te noyer avec d'autre considérations et te permettre de rester focalisé sur l'essentiel.

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
18 nov. 2013 à 23:22
Si tu ne t'en sors pas avec les opérations arithmétiques (elles sont peut-être moins évidentes pour toi), fais signe !
Et je te ferai demain matin un petit exemple pour traiter les images plus larges que hautes (il devrait te suffire pour adapter aux images plus hautes que larges).
Tu comprendras alors beaucoup mieux ce que je veux dire en parlant de la conservation des proportions (sinon : distorsion).
Bonne nuit.
0
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
19 nov. 2013 à 17:35
Bonjour Ucfoutu,

Ce n'est pas dans le but de te vieillir que je vous appelle Monsieur. C'est uniquement une question de respect comme me l'ont appris mes parents. Je dis toujours vous à tout le monde, Monsieur à toi qui pourriez être mon petit frère de par votre age.

En ce qui concerne ma procédure qui n'imprime pas mes photos au format 10x15, je serais très heureux qu'une âme charitable apporte le correctif nécessaire pour son bon fonctionnement (il suffit, je pense de rajouter deux ou trois instructions VB pour solutionner le problème).

L'arrivée de VB8, de VB Net et le remplacement de VB France par un autre site qui a perdu tout son intérêt m'ont dégoûté de la programmation. Je ne programme donc plus et ne veux plus me creuser la tête sur des problèmes VB.
Je n'apporte que des correctifs à mes applications lorsque cela est nécessaire.

Je te remercie encore une fois pour ton aide qui, je l'espère, réglera définitivement mon problème.

Cordialement.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 nov. 2013 à 17:46
Bon...
Je te concocte donc quelque-chose qui va t'être utile.
Et tu pourras faire tes essais sans gaspiller du papier et de l'encre (choix d'essai vers picturebox ou vers imprimante, car l'objet Printer réagit exactement comme un objet PictureBox).
Il va me falloir environ 20 minutes.
A plus ...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 19/11/2013 à 18:17
Alors voilà : Sur un Form :
un bouton de commande command1
une image image1
une picturebox Picture1

ne te préoccupe pas du scalemode du form (j'ai tout prévu) ni de Picture1 (mon code va passer le scalemode de picture1 en centimètres)

Lis tous mes commentaires (j'ai été suffisamment généreux dans leur rédaction pour qu'ils te soient utiles)

Code :

Option Explicit
Private Sub Command1_Click()
Dim dispositif As Object, L As Single, H As Single, DL As Single, DH As Single, K As Double, f_image As String
Dim margeg As Single, marged As Single, margeh As Single, margeb As Single, large As Single, haut As Single
Set dispositif = Picture1 ' çà, c'est pour tes tests. Remplace ensuite par Printer

' et maintenant : les marges que tu as ( si impri) ou définis (si sur picturebox)
' ces marges doivent être en unités logiques (centimètres si le scalemode du dispositif
' de sortie est en centimètres, par exemple
' les g, d, h, et b après marge pour désigner les marges gauche, droite, haute et basse
margeg = 0.2: marged = 0.32: margeh = 0.1: margeb = 0.1


With dispositif ' ====>> Qui sera donc celui désigné plus haut (pictur1 ici, puis printer en réel)
.ScaleMode = vbCentimeters ' puisque tu veux une échelle de sortie en centimètres
f_image = "d:\bimaanc.bmp" ' ===============>> mets là ton image à toi
Image1.Picture = LoadPicture(f_image)

'A CHOISIR (commente ce que tu ne veux pas

' si tu veux calculer depuis le fichier image d'origine
'L = ScaleX(LoadPicture(f_image).Width, vbHimetric, .ScaleMode) ' décomente si c'est ton choix
'H = ScaleY(LoadPicture(f_image).Height, vbHimetric, .ScaleMode) ' décomente si c'est ton choix

' si tu veux calculer depuis l'image déjà affichée
L = ScaleX(Image1.Picture.Width, vbHimetric, .ScaleMode) ' comente si tu préfères depuis fichier
H = ScaleY(Image1.Picture.Height, vbHimetric, .ScaleMode) ' comente si tu préfères depuis fichier

K = H / L

' déduisons les marges, puisque non imprimables sur ton imprimante
large = .ScaleWidth - margeg - marged
haut = .ScaleHeight - margeh - margeb
DL = large
DH = DL * K
If DH > haut Then
DH = haut
DL = DH / K
End If

'observe bien ces utilisations de PaintPicture. Elles sont plus complètes
'et gèrent plus la sortie que la tienne

' comente en fonction de ce que tu ne veux pas
'a) si tu veux centrer le résultat
.PaintPicture Image1, (.ScaleWidth - DL) / 2, (.ScaleHeight - DH) / 2, DL, DH, 0, 0, L, H
'b) si tu préfères que le résultaty soit au début de la surface disponible
'.PaintPicture Image1, margeg, margeh, DL, DH, 0, 0, L, H
End With
End Sub

Fais tes essais comme tu l'entends, vers la picturebox
Je t'ai laissé la possibilité de plusieurs choix, selon ce que tu commentes et/ou décommentes.
Ce code te permet le résultat le plus grand possible en fonction de la sortie.
Amuse-toi à faire varier en création les dimensions de la picturebox et constate ...
Je l'ai écrit pour une sortie "normale" (mode portrait si Printer). Si tu passes en mode Paysage, il te suffira d'inverser les dimensions de la feuille (les variables Large et Haut).
Dis-nous ...


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
19 nov. 2013 à 19:09
Les 20 minutes ont été respectées. Bravo !

Compte tenu du temps qu'il va me falloir pour décortiquer, je me donne jusqu'à demain pour te tenir informé.

Merci pour tout ce travail.
0
Bonjour,

J'ai fais plusieurs essais avec la procédure que tu m'as donnée. Le résultat attendu ne correspond pas à ce que voudrais obtenir.

Ce qui est impératif c'est de pouvoir imprimer l'intégralité de l'image, sans déformation sur du papier 15x10

Normalement, Printer.Papersize fournit au printer le type de papier à utiliser. Malheureusement je n'ai pas trouvé de valeur correspondant à du 15x10 d'ou l'utilisation de vbPRPSUser. Il est donc impératif d'indiquer à l'imprimante le type de papier afin qu'elle sélectionne (entre autres) le papier dans le bon tiroir.

J'ai longuement cherché ces jours derniers une source permettant d'imprimer sur du 15x10. Ce qui est curieux, c'est que je n'en ai rien trouvé. Techniquement, je sais que c'est possible ?........

Comme je ne suis pas un spécialiste, je n'ai peut-être pas utilisé ta procédure comme j'aurais du le faire. Si tu as du temps à me consacrer je te serais alors reconnaissant, de corriger ma procédure qui figure dans ma question initiale.

Encore merci.

cordialement
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
20 nov. 2013 à 17:54
Le code figurant dans ta discussion initiale ne saurait être "corrigé" !
Montre donc comment tu as utilisé le mien (ton code d'essai sur cette base). Lui, il me sera possible de l'analyser et d'y repérer ce qui ne va pas.
PS : le code que je t'ai montré marche bien en test chez moi !

0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 20/11/2013 à 18:29
Je viens de relire dans le détail le code de ton tout premier message et de relire ton dernier message également !
1) Je ne comprends pas que ton compilateur ait pu laisser passer cette ligne :
Printer.PaperSize = vbPRPSUser
sans message d'erreur !
Es-tu certain d'avoir présenté un code copié/collé ?
N"y aurait-il pas un On Error Resume Next dans ton code réel ?
Je te rappelle que cette constante ne peut servir à définir la propriété PaperSize (toutes les autres, oui, mais pas celle-là).
Le seul fait de définir Width et Height de l'objet Printer fait par contre que PaperSize = 256 (donc la valeur de vbPRPSUser)
2) Pour ce qui est du choix du tiroir,

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
Printer.papersize --> Pas de On error

Un des derniers essais que j'ai fais.

Je ne veux pas abuser de ton temps. Si demain matin je n'ai pas trouvé, je ferais alors appel à "Windows" pour imprimer

Encore Merci.


Option Explicit

Private Sub Form_Load()
Me.Caption = App.EXEName
Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
Image1.Picture = LoadPicture("D:\Mamy Photos\Lespinasse\dsc01959.jpg")
Call Imprime0
End Sub

Sub Imprime0()

Dim L As Single, H As Single, DL As Single, DH As Single, K As Double
Dim margeg As Single, marged As Single, margeh As Single, margeb As Single, large As Single, haut As Single

Printer.ScaleMode = vbCentimeters

L = ScaleX(Image1.Picture.Width, vbHimetric, Printer.ScaleMode)
H = ScaleY(Image1.Picture.Height, vbHimetric, Printer.ScaleMode)
K = H / L

'margeg = 0.2: marged = 0.32: margeh = 0.1: margeb = 0.1

margeg = 0: marged = 0
large = Printer.ScaleWidth - margeg - marged
haut = Printer.ScaleHeight - margeh - margeb

DL = large
DH = DL * K

If DH > haut Then
DH = haut
DL = DH / K
End If

Printer.PaintPicture Image1, margeg, margeh, DL, DH, 0, 0, L, H

Printer.EndDoc

End Sub
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 20/11/2013 à 19:53
Déjà (je verrai le reste demain) :
margeg = 0: marged = 0
ne correspond pas à ce que ton imprimante a !
Pour mémoire (ce que tu as dis) :
"et présente les marges suivantes:
- Gauche: 2 Mm - Droite: 32 Mm - Haute: 10 Mm - Basse: 10 Mm.
"
Ce n'est pas toi, qui fixes les "capacités" de ton imprimante ! si elle n'est pas capable d'imprimer "bord à bord" (relis-moi), c'est elle, qui impose sa surface imprimable, pas toi (toi, tu ne peux que les subir, ces limitations matérielles là !)
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 nov. 2013 à 08:13
Bon ...
Tu n'as nulle part défini les dimensions données à l'objet Printer ! ===>> A faire, pardi (par analogie avec le test avec Picturebox, ce sont les dimensions que tu donnais manuellement). Comment veux-tu alors que cela fonctionne ???
Si tu veux en plus que le papier soit choisi dans un tiroir, je te rappelle la nécessité (voir ce que je t'en ai dit plus haut) de préciser ce tiroir (propriété PaperBin de ton objet Printer, et à condition que ton imprimante offre cette possibilité)!
0
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
Modifié par Cjvg le 21/11/2013 à 10:11
Bonjour,

Si paintpicture permet d'imprimer une photo comme je le souhaite, je pense qu'il est alors possible de faire la même chose avec Vb6.

Comme je le dis plus haut, j'ai fais beaucoup d'essais avec ta procédure. C'est le dernier test que j'ai joint à mon message.

Moyennant quelques petites modifications, je pense que ma procédure devrait fonctionner.

J'abandonne.

Encore merci.
0
Rejoignez-nous