Impression en paysage

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
rakiya
Messages : 20
Inscription : lun. 02/mars/2009 23:26

Impression en paysage

Message par rakiya »

Bonjour
je voudrais imprimer directement du programme en utilisant la biblioteque printer
le probleme est que je dois imprimer en paysage et je cherche un moyen de le faire automatiquement sans que l'utilisateur doisse passer par les preferences de l'imprimante a chaque fois

merci
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Une solution consiste à créer le document dans une image, à tourner l'image à 90° et à imprimer l'image obtenue.

Il y a sûrement d'autres solutions comme régler les paramètres d'impression manuellement mais je ne me suis pas penché sur cette méthode, vu que j'ai utilisé celle ci-dessus.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Procédure qui tourne une image d'un quart de tour. (Tirée du forum anglais)

Code : Tout sélectionner

Procedure RotateImage(ImageNumber.I)
   Protected Result.I
   Protected Width.I
   Protected Height.I
   Protected Temp.I
   Protected *Ptr
   Protected SoI.I   
   SoI = SizeOf(INTEGER)
   *Ptr = AllocateMemory(6 * SoI)
   Height = ImageHeight(ImageNumber)
   Width = ImageWidth(ImageNumber)
   If Height > Width
      Temp = CreateImage(#PB_Any, Height, Height)
   Else
      Temp = CreateImage(#PB_Any, Width, Width)
   EndIf
   PokeI(*Ptr, Height): *Ptr + SoI
   PokeI(*Ptr, 0):      *Ptr + SoI
   PokeI(*Ptr, Height): *Ptr + SoI
   PokeI(*Ptr, Width):  *Ptr + SoI
   PokeI(*Ptr, 0):      *Ptr + SoI
   PokeI(*Ptr, 0):      *Ptr + SoI
   DC = StartDrawing(ImageOutput(Temp) )
      DrawImage(ImageID(ImageNumber),0,0)
      PlgBlt_(DC, *Ptr - (6 * SoI), DC, 0, 0, Width, Height, 0, 0, 0)
   StopDrawing()
   If ImageNumber > 99999
      FreeImage(ImageNumber)
      Result = GrabImage(Temp, -1, 0, 0, Height, Width)
   Else
      Result = GrabImage(Temp, ImageNumber, 0, 0, Height, Width)
   EndIf
   FreeImage(Temp)
   ProcedureReturn Result
EndProcedure




;**************
; Test 
;**************

For I = 0 To 1
   Img = CreateImage(#PB_Any, 256, 16)
   StartDrawing(ImageOutput(Img) )
      Box(0, 0, 256, 16, #Blue)
      DrawText(0, 0, "Cliquez sur ce message...", #White, #Blue)
   StopDrawing()
   If I = 1
      RotateImage(Img) ; *************
   EndIf
   WW = ImageWidth(Img)
   HH = ImageHeight(Img)
   OpenWindow(0, 0, 0, WW, HH, "", $80000001)
   ImageGadget(0, 0, 0, WW, HH, ImageID(Img) )
   Repeat
   Until WaitWindowEvent() = #PB_Event_Gadget
   CloseWindow(0)
   FreeImage(Img)
Next I
End
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ici aussi il y avait une procedure pour ça !! ;)

en fait il y en a meme plein !! :lol:

bon la mienne

image a rotationner
Image

Code : Tout sélectionner



;Rotate image
; codé par Dobro
; en purebasic 4.00

Declare rotate_image(id,x,Y,degres) 

Structure image
    x.l[1024]
    Y.l[768] 
EndStructure
Global Dim image.image(360)
Global Dim tabl1(1024,768 ) 

UseJPEGImageDecoder ()
InitSprite ()

#dobro =1
#Police =1
#Sprite =1
#image1 =1
#image2 =2



; ***********************************
FontID = LoadFont ( #Police , "arial" , 50, #PB_Font_Bold )
EcranX = GetSystemMetrics_ ( #SM_CXSCREEN ): ;=largeur de l'ecran
EcranY = GetSystemMetrics_ ( #SM_CYSCREEN ): ;=hauteur de l'ecran
    WindowID = OpenWindow (1, 0, 0, EcranX, EcranY, "hello" , #PB_Window_BorderLess |#PB_Window_ScreenCentered )
    
    WindowID = WindowID (1)
    Result = OpenWindowedScreen ( WindowID ,0,0, EcranX, EcranY, 1, 0,0)
    
        
LoadImage ( #image1 , "logo2.jpg" ) ;<----- path of the picture
largeur = ImageWidth(#image1)
hauteur = ImageHeight(#image1)  
CreateImage ( #image2 ,largeur,hauteur )
    
  
   ; ******* mise en tableau de l'image **********
StartDrawing ( ImageOutput ( #image1) )
For Y=1 To hauteur
    For x=1 To largeur
        tabl1(x,Y)= Point (x,Y)  
    Next x
Next Y
StopDrawing ()
    ;*****************************************************  


    
Resultat = InitMouse ()
Repeat
    ExamineMouse ()
    Event= WindowEvent ()
    Delay (2) 
    angle_degres=angle_degres+5 :If angle_degres>360:angle_degres=1:EndIf 
    rotate_image(#image2,largeur, hauteur,  angle_degres)  ; rotate a Dobro

    ; ****** **on affiche l'image ********
    StartDrawing ( ScreenOutput ())
   DrawImage ( ImageID ( #image2 ), 100, 100); rotate a Dobro
    StopDrawing ()
    ; ******************************* 
    FlipBuffers (): ; affiche l'ecran
    ClearScreen ( RGB (0, 0, 0)) : ;efface l'ecran
    Event= WindowEvent () 
    ;}
    
    If MouseButton (2)
        End
    EndIf
    
Until Event= #PB_Event_CloseWindow
    
    
Procedure rotate_image(id,x2,y2,degres)  
    x3=x2/2
    y3=y2/2
    StartDrawing ( ImageOutput ( id ) ) 
    For Y=1 To y2
        For x=1 To x2
            ; ********* voici la formule de la rotation d'image *********
            image(degres)\x[x]= x3+(x-x3) * Cos (degres* #PI /180) +( Y-y3)* Sin (degres* #PI /180)
            image(degres)\Y[Y]= y3-(x-x3) * Sin (degres* #PI /180) + (Y-y3)* Cos (degres* #PI /180) 
            ;***************************************************** 
            ; *** on evite que les coordonée sorte du tableau dim ****
            If   image(degres) \Y[Y] <0 : image(degres) \Y[Y]=y2-image(degres) \Y[Y] : EndIf
            If   image(degres)\Y[Y] >y2 : image(degres) \Y[Y] =0+image(degres)\Y[Y] -y2: EndIf
            If    image(degres)\x[x]>x2 : image(degres)\x[x]=0+image(degres)\x[x]-x2: EndIf
            If    image(degres)\x[x]<1 : image(degres)\x[x]=x2-image(degres)\x[x]: EndIf  
            ; ***************************************** 
            Plot (x,Y,tabl1( image(degres)\x[x],image(degres)\Y[Y])) ; on dessine l'image rotaté a l'aide du tableau de points : D
        Next x
    Next Y 
    StopDrawing () 
EndProcedure


cependant une impression en mode Paysage (a la française)
ce n'est pas une rotation d'image !!

c'est une rotation de la Feuille , mais pas de l'ecriture !!

il n'y aurai pas un code style code EPSON pour ce genre de truc ?
Dernière modification par Backup le mar. 26/mai/2009 17:39, modifié 3 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

gdiplus

Message par kernadec »

bonjour
si tu est sous Windows je pense que la meilleur solution
c'est le GDI+ malgré sa lenteur! c'est tout de même bien.
voir la documentation remarquable de Denis sur le sujet à ce post:
http://www.purebasic.fr/french/viewtopi ... ht=gdiplus
au revoir
rakiya
Messages : 20
Inscription : lun. 02/mars/2009 23:26

Merci tout le monde

Message par rakiya »

Merci tout le monde

Mais j'utilise la version 4.20 et les deux procedures ne marchent pas

que faire

merci encore et bonsoir
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

j'ai reedité mon code pour mettre ma procedure en condition de travail
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@Rakiya

Quelles erreurs tu vois apparaître? Sinon, il y a la version 4.30 complète. C'est quand même utile quand on a besoin des fonctions de l'API...

Ollivier

Code : Tout sélectionner

Procedure.I RotateImage2(Image.I)
   Protected Result.I
   Protected SourceLarg.I
   Protected SourceHaut.I
   Protected DestLarg.I
   Protected DestHaut.I
   SourceLarg = ImageWidth(Image)
   SourceHaut = ImageHeight(Image)
   DestLarg = SourceHaut
   DestHaut = SourceLarg
   Result = CreateImage(-1, DestLarg, DestHaut)
   For Y = 0 To (SourceHaut - 1)
      For X = 0 To (SourceLarg - 1)
         StartDrawing(ImageOutput(Image) )
            C = Point(X, Y)
         StopDrawing()    
         StartDrawing(ImageOutput(Result) )
            Plot(DestLarg - Y - 1, X, C)
         StopDrawing()     
      Next X
   Next Y
   ProcedureReturn Result
EndProcedure


;**************
; Test
;**************

For I = 0 To 1
   Img = CreateImage(#PB_Any, 256, 16)
   StartDrawing(ImageOutput(Img) )
      Box(0, 0, 256, 16, #Blue)
      DrawText(0, 0, "Cliquez sur ce message...", #White, #Blue)
   StopDrawing()
   If I = 1
      Img = RotateImage2(Img) ; *************
   EndIf
   WW = ImageWidth(Img)
   HH = ImageHeight(Img)
   OpenWindow(0, 0, 0, WW, HH, "", $80000001)
   creategadgetlist(WindowID(0) )
   ImageGadget(0, 0, 0, WW, HH, ImageID(Img) )
   Repeat
   Until WaitWindowEvent() = #PB_Event_Gadget
   CloseWindow(0)
   FreeImage(Img)
Next I
End 
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Impression en paysage

Message par Ar-S »

Salut, j'ai essayer d'adapter la procédure mais sans succès, j'obtiens une image toute noire bouffeuse d'encre à la place de mon image format paysage.
Je vais commenter le code pour vous expliquer le pourquoi du comment de ce qui se passe.

Code : Tout sélectionner

#ImagePaysage=11
#Image=10

;(...) code

Case #Imprim
            img=VBin_(NomArchive$,Str(k)+".jpg",Key$) ; je vais chercher une image dans mon conteneur VBIN
            If img
              CatchImage(#Image,img) 
              LargImage = ImageWidth(#Image) : HautImage = ImageHeight(#Image) ; il chope les tailles H et L
              If LargImage>HautImage ; si largeur est plus grande que hauteur 
                FormatImage$="paysage" ; on dit que c'est du paysage
                ;-ici j'ai repris la procédure
                DestLarg = HautImage
                DestHaut = LargImage
                Result = CreateImage(#ImagePaysage, DestLarg, DestHaut)
                For y = 0 To (HautImage - 1)
                  For x = 0 To (LargImage - 1)
                    StartDrawing(ImageOutput(#ImagePaysage) )
                      C = Point(x, y)
                    StopDrawing()   
                    StartDrawing(ImageOutput(#ImagePaysage) )
                      Plot(DestLarg - y - 1, x, C)
                    StopDrawing()     
                  Next x
                Next y
                ResizeImage(#ImagePaysage,2244,3189,#PB_Image_Smooth) ; ici je redimensionne l'image pour qu'elle prenne preque la taille entière d'une feuille
                    ; A4, en effet les images sont en 75 DPI donc je les grossi +- 4 fois
               
              Else
                FormatImage$="portrait"  
                ResizeImage(#Image,2244,3189,#PB_Image_Smooth)
                ;si format est en portrait on change rien si ce n'est le redimensionnement
              EndIf  
               
              DetectImprim=DefaultPrinter()
              If DetectImprim=0
                MessageRequester ("Erreur","Aucune imprimante n'est détectée !",#MB_ICONEXCLAMATION)
              Else
                  If StartPrinting("LDVM Printer")
                    If StartDrawing(PrinterOutput())
                        If FormatImage$="portrait"
                          DrawImage(ImageID(#Image), 50, 50) ; petite marge de 50 et on imprime #image
                        ElseIf FormatImage$="paysage"
                          DrawImage(ImageID(#ImagePaysage), 50, 50) ; petite marge de 50 et on imprime #imagepaysage
                        EndIf  
                      StopDrawing() 
                    Else
                      MessageRequester ("Erreur","Impossible d'imprimer !",#MB_ICONEXCLAMATION)
                    EndIf
                    StopPrinting()
                  EndIf
              EndIf
            Else
              MessageRequester("erreur","Image Introuvable")
            EndIf
Donc 2 choses que je comprends pas (même si je me dis que #imagepaysage doit y etre pour quelque chose)
- Déjà la lenteur du traitement pour la rotation de l'image, ça prends plusieurs secondes pour que l'image tourne de 90 degrés, est-ce normal ??
- Pourquoi l'image paysage est noire.

ça vous semblera peut être bête mais je bloque depuis un bon moment et ça commence à me prendre la courge.

Une commande PB en natif pour indiquer le format de sortie paysage ou portrait fait cruellement défaut :twisted: ! Alors la 3D et tout c'est super cool, mais la base reste la base ! Je ne voudrais pas que les utilisateurs aient à aller paramétrer l'impression avec PrintRequester()

Sur ce je vais faire à bouffer ça me changera les idées, et puis j'ai la dalle.

Merci de votre aide
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Impression en paysage

Message par Backup »

Ar-S a écrit : - Déjà la lenteur du traitement pour la rotation de l'image, ça prends plusieurs secondes pour que l'image tourne de 90 degrés, est-ce normal ??
ben lorsque je vois ça :

Code : Tout sélectionner

For x = 0 To (LargImage - 1)
  
  StartDrawing(ImageOutput(#ImagePaysage) )
    C = Point(x, y)
  StopDrawing()   
  StartDrawing(ImageOutput(#ImagePaysage) )
    Plot(DestLarg - y - 1, x, C)
  StopDrawing()     
  
Next x
deja mettre un StartDrawing() dans une boucle c'est tres tres lent !

mais alors utiliser 2 fois StartDrawing()- StopDrawing() c'est du vice :D
a la place des lignes ci dessus , tu pourrai faire :

Code : Tout sélectionner

StartDrawing(ImageOutput(#ImagePaysage) )
  
  For x = 0 To (LargImage - 1) 
    C = Point(x, y) 
    Plot(DestLarg - y - 1, x, C) 
  Next x
  
StopDrawing()     
:)
tu vas gagner en vitesse :)
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Impression en paysage

Message par Ar-S »

ENFIN !
J'ai trouvé une lib permettant de gérer plus d'options que celles en natives de PB.

C'est Printer_Lib (quelle surprise :))
Les sources sont incluses.
http://www.purebasicpower.de/?PrinterLib


Donc maintenant "portrait et paysage" ne sont plus du tout un soucis, le seul problème qui persiste est que je n'arrive pas à adapter à la volée la taille de l'image
pour qu'elle prenne 100% de la page (marges exceptées).. (alors que j'y arrivait en portrait avec les commandes de PB.. décidément). :?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre