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
21 nov. 2013 à 11:35
" 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"
Mais ... PaintPicture, C'EST VB6 !
Relis-moi : de la même manière que tu attribues des dimensions (en création) à la picturebox, tu dois en attribuer à l'objet Printer (mais là : par code, en définissant ses propriétés Width et Height, juste après ta ligne disant Printer.ScaleMode = vbCentimeters).
Je te rappelle que (me relire) dès lors que tu définis ces 2 propriétés, tu passes automatiquement à vbPRPSUser et n'as surtout pas à écrire : Printer.PaperSize = vbPRPSUser
Si (et seulement si, bien évidemment) le pilote de ton imprimante accepte de gérer CETTE taille de papier, aucune raison pour que mon code (testé sans aucun problème chez moi, je te le répète) ne fonctionne pas à la perfection.

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 à 15:14
- Si ce n'est Paintpicture c'est avec un autre utilitaire Windows. Cet utilitaire imprime les photos "Numériques" en 15x10 sans déformation et sur toute la surface du papier.

- Dans ma procédure, Printer.width et Printer.height figurent derrière Printer.ScaleMode.

- Si je retire Printer.PaperSize = vbPRPSUser de ma procédure, il y a alors un message d'erreur --> Format du papier Inconnu.

- Je suis certain que ta procédure fonctionne pas chez toi.

- Comme je ne sais pas corriger ma source en fonction de toutes les informations que tu m'as données, ce serait peut-être plus simple que tu m'indiques ou placer les deux ou trois instructions qui manquent à ma procédure.

Je suis désolé --> J'abandonne

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
Modifié par ucfoutu le 21/11/2013 à 17:29
1) PaintPicture est une méthode VB6 (ce n'est pas un "utilitaire")
2) tu DOIS retirer cette ligne Printer.PaperSize = vbPRPSUser. Tu DOIS par contre, en lieu et place, définir les propriétés Width et Height
et lire l'aide VB6 qui dit :
"Setting a printer's Height or Width property automatically sets PaperSize to vbPRPSUser".

La même aide VB6 précise enfin :
"Note The effect of the properties of the Printer object depends on the driver supplied by the printer manufacturer. Some property settings may have no effect, or several different property settings may all have the same effect. Settings outside the accepted range may or may not produce an error. For more information, see the manufacturer's documentation for the specific driver." *****
d'où ma remarque plus haut :
"Si (et seulement si, bien évidemment) le pilote de ton imprimante accepte de gérer CETTE taille de papier"

3) Que veux-tu que je réponde à :
"- Je suis certain que ta procédure fonctionne pas chez toi."
???
Il se trouve qu'elle fonctionne !

***** on va vite savoir si ton imprimante CANNON MG7150 accepte de gérer du 10 x 15
Sur un Form : un bouton de commande command1, une textbox Text1.
Mets à True la propriété multiline de la textbox et lance ce code :
Private Sub Command1_Click()
With Printer
.ScaleMode = 7
.Width = 10
.Height = 15
Text1.Text = "ton imprimante est " & .DeviceName & vbCrLf & "tu as défini son papersize à " & .PaperSize & vbCrLf & _
"en te précisant que 256 est la valeur de la constante vbPRPSUser " & vbCrLf & _
"elle a tenté de s'adapter ta demande (si dans ses possibilités) " & vbCrLf & vbCrLf & _
" elle est après cette tentative prête à gérer une impression sur du papier de " & _
.ScaleWidth & " de lage par " & .ScaleHeight & " de haut" & vbCrLf & _
"si la ligne précédente de dit pas 10 x 15, c'est que ton imprimante n'est pas conçue pour gérer " & _
"l'impression sur ce format ou que, si oui, son pilote n'est pas le bon"
End With
End Sub
Puis fais un copié/collé de ce qui apparais dans la textboix et montre-le moi

________________________
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 21/11/2013 à 17:42
Ta réponse est importante, car, si l'imprimante concernée n'est pas prévue pour gérer l'impression sur un tel format, on va (facile) adapter mon code au seul format par défaut qu'elle reconnaît.

________________________
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

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

Posez votre question
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 21/11/2013 à 18:04
Lorsque tu auras fait le test précédent (et relevé, pour me le montrer, te texte de la textbox), fais également celui-ci, encore plus précis, et rapporte-moi également ce que tu as dans la textbox :

Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, lpDevMode As Any) As Long

Private Sub Command1_Click()
Dim a As String, r As Long, PaperSizes() As Integer, C As Long
r = DeviceCapabilities(Printer.DeviceName, "LPT1", 2, ByVal 0&, ByVal 0&)
ReDim PaperSizes(1 To r) As Integer
Call DeviceCapabilities(Printer.DeviceName, "LPT1", 2, PaperSizes(1), ByVal 0&)
a = a & "formats d'impression supportés par l'imprimante " & Printer.DeviceName
For C = 1 To r
a = a & vbCrLf & Str$(PaperSizes(C))
Next
Text1.Text = a
End Sub

________________________
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
Résultats des tests

ton imprimante est Canon MG7100 series Printer (Copie 1)
tu as défini son papersize à 256
en te précisant que 256 est la valeur de la constante vbPRPSUser
elle a tenté de s'adapter ta demande (si dans ses possibilités)

elle est après cette tentative prête à gérer une impression sur du papier de 20,32002 de lage par 11,89921 de haut
si la ligne précédente de dit pas 10 x 15, c'est que ton imprimante n'est pas conçue pour gérer l'impression sur ce format ou que, si oui, son pilote n'est pas le bon
--------------------------------------------------------------------

formats d'impression supportés par l'imprimante Canon MG7100 series Printer (Copie 1)
1
5
11
9
13
119
121
142
167
168
169
170
43
69
20
27
73
74
91
171
172
3
24
8
274
66
12
257
297
296
256
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 nov. 2013 à 09:31
"elle est après cette tentative prête à gérer une impression sur du papier de 20,32002 de lage par 11,89921 de haut "
Tu as donc là un sérieux problème avec cette imprimante, qui n'a pas été capable d'obéir à tes instructions, bien (le second test) qu'elle soit supposée accepter un format de papier correspondant à la constante vbPRPSUser !
J'ignore si c'est un défaut de ton imprimante ou un défaut de son driver !
0
Bonjour,

J'ai eu le même problème avec l'imprimante HP de mon épouse. Impossible d'imprimer.

La nouvelle imprimante que nous avons achetée (une canon) imprime correctement les photos sur du 10x15, sans marge et non déformée. J'ai utilisé l'explorateur windows pour lancer cette impression.

J'en déduis que le problème se trouve de ma procédure VB.

Dommage que ce très long roman se termine en "queue de poisson"

Merci encore.

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
Modifié par ucfoutu le 23/11/2013 à 11:14
En lançant une impression depuis l'explorateur Windows, tu ne définis pas toi-même tout ce que utilises depuis VB6 et l'impression se fait autrement.
On va maintenant essayer (pour ne pas terminer en queue de poisson) de ne pas intervenir du tout, depuis VB6, sur le format de papier, mais de se contenter de dire sur quelles dimensions tu veux l'impression et on va laisser le driver de l'imprimante gérer comme il l'entend, lui.
Dans le code que je t'ai donné, donc :
remplace :
 large = .ScaleWidth - margeg - marged
haut = .ScaleHeight - margeh - margeb

par, directement
 large = 10 - margeg - marged
haut = 15 - margeh - margeb

où tu remplaces 10 et 15 par les dimensions que tu veux à ton impression.

Seule précaution à prendre alors : ne pas donner des dimensions supérieures à celle du papier que tu mets dans l'imprimante.
Choisir par ailleurs l'impression non centrée (dans le choix que j'ai mis dans mon code).
Si, comme je le pense, ton driver d'imprimante reçoit des informations depuis l'imprimante elle-même, cela devrait fonctionner.
Essaye et dis-moi.

________________________
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
Est-ce que c'est cela que tu suggères ?

S'il y a d'autre essais à faire, j'utiliserais toujours l'exemple ci-dessous.


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: marged = 0

margeg = 0.2: marged = 0.32: margeh = 0.1: margeb = 0.1
'large = Printer.ScaleWidth - margeg - marged
'haut = Printer.ScaleHeight - margeh - margeb
large = 10 - margeg -marged '<--------------------------------
haut = 15 - 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
23 nov. 2013 à 11:56
Oui.
Essaye et dis-moi
0
- L'impression sélectionne maintenant le casier contenant les enveloppes.

- N'est imprimée sur l'enveloppe, que la demie partie droite de l'image.

- Elle apparaît dans le haut cadrée à gauche de l'enveloppe. Les proportions semblent correctes.

J'ai fais un test avec la source comme tu me l'as demandé. (Il y a des instructions que j'aurais voulu modifier mais je n'ai rien fais)

Je souhaite que cette source reste le modèle pour les essais. s'il y a d'autres essais à faire.

Merci encore.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 nov. 2013 à 18:18
Et le tiroir contenant les enveloppes est-il celui que tu veux choisir ?
Si non : définis celui que tu veux choisir pour cette impression (Printer.paperBin = ....)
0
- Le tiroir que je veux choisir n'es' pas celui des enveloppes.

- J'ai ajouté Printer.paperbin = vbPRBNUpper (Tiroir du Haut)
L'ajout de cette ligne a provoqué une erreur VB à l'exécution.

J'ai lancé l'exécution des instructions ci-dessous

Select Case Printer.PaperBin
Case vbPRBNUpper
Printer.Print ("Using the upper bin")
Case vbPRBNLower
Printer.Print ("Using the lower bin")
Case vbPRBNMiddle
Printer.Print ("Using the middle bin")
Case vbPRBNManual
Printer.Print ("Insert a sheet of paper")
Case vbPRBNEnvelope
Printer.Print ("Using the envelope feeder")
Case vbPRBNEnvManual
Printer.Print ("Insert an envelope")
Case vbPRBNTractor
Printer.Print ("Using the tractor feeder")
Case vbPRBNSmallFmt
Printer.Print ("Using the small paper feeder")
Case vbPRBNLargeFmt
Printer.Print ("Using the large paper bin")
Case vbPRBNLargeCapacity
Printer.Print ("Using the large capacity feeder")
Case vbPRBNCassette
Printer.Print ("Using the attached cassette cartridge")
Case Else
Printer.Print ("Using the default paper bin")
End Select

Le message imprimé est le suivant: Using the default paper bin
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
23 nov. 2013 à 20:18
Ce qui veut dire ce que cela veut dire :
- soit cette imprimante ne peut dialoguer efficacement avec Windows (driver inadapté à windows)
- soit elle n'est matériellement pas conçue pour permettre ces choix depuis Windows
Désolé, mais dans un tel cas, je ne vois personnellement aucune autre solution que de faire le choix, manuellement, du tiroir d'impression, puis de lancer ton impression par code.
0
CQFD

Merci
0
Rejoignez-nous