Page 1 sur 2

imprimer une image tournee

Publié : mer. 10/nov./2010 16:46
par Parole De JOJO
jai une image a imprimer mais elle est en paysage et je ne veux pas passer par les preferences de limprimante pour la retourner
y a il un moyen de la retourner dans le prog et de limprimer direct?
merci

Re: imprimer une image tournee

Publié : mer. 10/nov./2010 18:12
par Warkering
Peut-être en effectuant une rotation pixel par pixel?

Re: imprimer une image tournee

Publié : mer. 10/nov./2010 18:25
par venom
Warkering a écrit :Peut-être en effectuant une rotation pixel par pixel?
C'est la première chose qui m'est venu a l'esprit aussi. Dommage dans les fonctions 2DDrawing tu a DrawRotatedText() qui te permet de tourner du texte.

ou alors via un sprit ou screen peut être. ?


EDIT :

j'avais un code qui redessiner une image pixel par pixel, j'ai un peut bidouiller, l'image se tourne bien mais elle est inversé :lol:

Code : Tout sélectionner

Structure img
	x.l
	y.l
	color.l
	inv.l
EndStructure
UseJPEGImageDecoder()

file$ = OpenFileRequester("fichier image", "", "image |*.bmp;*.jpg", 0) ; <---- ont choisit une image bitmap
If LoadImage(1, file$) ; <--- ont charge l'image du dessus
	If StartDrawing(ImageOutput(1))
			width = ImageWidth(1) ; <--- ont prend la largeur de l'image
			height = ImageHeight(1) ; <--- ont prend la hauteur de l'image
			size = width * height ; <--- ont multiplie la largeur par la hauteur pour savoir le nombre de pixels au total
			Dim Array.img(size)
			
			; <------------------------- ont récupère la  couleur de chaque pixel -----------------------
			i = 0
			For y = 0 To height - 1
				For x = 0 To width - 1
					color = Point(x, y)
					Array(i)\x = x
					Array(i)\y = y
					Array(i)\color = color
					i + 1
				Next
			Next
			; <------------------------------------------------------------------------------------------
		StopDrawing()
		
	EndIf
EndIf

If OpenWindow(0, 0, 0, ImageHeight(1), ImageWidth(1), "") ; <------------------------- ont ouvre une fenêtre a la taille de l'image
	If CreateImage(0, ImageHeight(1), ImageWidth(1)) ; <------------------------- ont charge l'environnement image
		If StartDrawing(ImageOutput(0))
				
				For i = 0 To size - 1
					i = 0
					For y = 0 To height -1
						For x = width -1 To 0 Step -1
							i + 1
							Plot(Array(i) = y, Array(i) = x, RGB(Red(Array(i)\color), Green(Array(i)\color), Blue(Array(i)\color))) ; <----- ici ont redessine pixel par pixel sur le Drawing()
						Next
					Next
				Next
				
				
			StopDrawing()
		EndIf
	EndIf
	
	ImageGadget(0, 0, 0, 0, 0, ImageID(0))
	
	Repeat
		EventID = WaitWindowEvent()
	Until EventID = #PB_Event_CloseWindow
EndIf
; <------------------------- et ont quitte


@++

Re: imprimer une image tournee

Publié : mer. 10/nov./2010 21:15
par PAPIPP
Bonjour parole de JOJO
Avec effect de LSI Le Soldat Iconnu
http://www.lsi-dev.com/

Librairie Effect

Index des commandes :

GetImageBits
ImageSymmetryH
ImageSymmetryV
RotateImage
RotateImageEx
SetImageBits


RotateImage()

Syntaxe :

RotateImage(ImageID, Angle.l)

Description :

Rotation d'une image d'un angle multiple de 90°.

Le paramètre ImageID doit recevoir le handle d'une image. Par exemple : UseImage(#Image)
Le paramètre Angle doit recevoir un angle multiple de 90°. Par exemple 90, 180, 270, -90, -180, -270

La fonction retourne l'identifiant de l'image pivotée. (Ne pas confondre Identifiant et Handle)

Exemple :

Code : Tout sélectionner

ImageNormale = CreateImage(#PB_Any, 80, 100)
StartDrawing(ImageOutput())
Box(0, 0, 80, 100, $6F6F6F)
Box(5, 5, 35, 45, $FF)
Box(40, 5, 35, 45, $FF00)
Box(5, 50, 35, 45, $FF0000)
Box(40, 50, 35, 45, $FFFFFF)
StopDrawing() 
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Effect - Rotation d'image") = 0 Or CreateGadgetList(WindowID()) = 0
End
EndIf
TextGadget(#PB_Any, 10, 10, 100, 15, "Image normale")
ImageGadget(#PB_Any, 10, 25, 0, 0, UseImage(ImageNormale))
TextGadget(#PB_Any, 120, 10, 100, 15, "Rotation de 90°")
ImageRotation90 = RotateImage(UseImage(ImageNormale), 90) ; ou -270°
ImageGadget(#PB_Any, 120, 25, 0, 0, UseImage(ImageRotation90))
TextGadget(#PB_Any, 10, 135, 100, 15, "Rotation de 180°")
ImageRotation180 = RotateImage(UseImage(ImageNormale), 180) ; ou -180°
ImageGadget(#PB_Any, 10, 150, 0, 0, UseImage(ImageRotation180))
TextGadget(#PB_Any, 120, 135, 100, 15, "Rotation de 270°")
ImageRotation270 = RotateImage(UseImage(ImageNormale), 270) ; ou -90°
ImageGadget(#PB_Any, 120, 150, 0, 0, UseImage(ImageRotation270))

Repeat
Event = WaitWindowEvent()

Until Event = #PB_EventCloseWindow
A+

Re: imprimer une image tournee

Publié : mer. 10/nov./2010 22:27
par Backup
.................

Re: imprimer une image tournee

Publié : mer. 10/nov./2010 23:54
par Warkering
Et PAF! Maître Dobro a encore frappé un gros coup de sa Connaissance! :mrgreen:

Re: imprimer une image tournee

Publié : jeu. 11/nov./2010 0:26
par PAPIPP
Bonjour Dobro
Erreur sur le prg ligne 68 point(x,y) en dehors de l'image
j'ai corrigé comme cela :

Code : Tout sélectionner

; Rotation d'image sans Librairie :)
; 
; utilisation :
; rotate_image(#image2,largeur,hauteur,angle_degres)
; 
; Citation:
; 
; 


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

Declare rotate_image(id,x,Y,degres)


UseJPEGImageDecoder()
InitSprite()

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

Structure image
  x.l
  Y.l
EndStructure
Global Dim image.image(1)


; ***********************************
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)


; principe de rotation
;x1 = coordonée x du point rotationé
;Y1= coordonée y du point rotationé
; a = angle de rotation
; x1 = x * Cos(a) + Y * Sin(a);
; y1 = -x * Sin(a) + Y * Cos(a)

;NomFichier$ = OpenFileRequester("charge image (pas tros grosse !!)","*.jpg", "*.jpg",0)
; NomFichier$="logo2.jpg"
NomFichier$="L:\program files\images\pinguin.jpg"

LoadImage(#image1,NomFichier$) ;<----- path of the picture



largeur=ImageWidth(#image1)
hauteur=ImageHeight(#image1)
CreateImage(#image2,largeur,hauteur)
Global Dim tabl1(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
    For Y=0 To hauteur-1
    For x=0 To largeur-1
      tabl1(x,Y)=Point(x,Y)
    Next x
  Next Y

StopDrawing()
;*****************************************************

Resultat=InitMouse()
Repeat
  ExamineMouse()
  Event=WindowEvent()
  Delay(2)
  angle_degres=angle_degres+2:If angle_degres>360:angle_degres=1:EndIf
  rotate_image(#image2,largeur,hauteur,angle_degres)
  
  ; ****** **on affiche l'image ********
  StartDrawing(ScreenOutput())
    DrawImage(ImageID(#image2),1,1)
  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)
  ;id = id picture
  ;x2=Width
  ;y2=Height
  
  ;degres=rotation in degres
  ; *** Merci Comtois : D *********
  ;x' = x0 + (x-x0)*cos(A) + (y-y0)*sin(A)
  ;Y' = y0 - (x-x0)*sin(A) + (y-y0)*cos(A)
  x3=x2/2 ; le milieu x de l'image
  y3=y2/2 ; le milieu y de l'image
  StartDrawing(ImageOutput(id) )
    For Y=0 To y2-1
      For x=0 To x2-1
        ; ********* voici la formule de la rotation d'image *********
        image(1)\x=x3+(x-x3)*Cos(degres*#PI/180)+(Y-y3)*Sin(degres*#PI/180)
        image(1)\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(1) \Y<0:image(1) \Y=0:EndIf
        If image(1)\Y>y2:image(1) \Y=y2:EndIf
        If image(1)\x>x2:image(1)\x=x2:EndIf
        If image(1)\x<0:image(1)\x=0:EndIf
        ; *****************************************
        Plot(x,Y,tabl1(image(1)\x,image(1)\Y)) ; on dessine l'image rotaté a l'aide du tableau de points : D
      Next x
    Next Y
  StopDrawing()
EndProcedure

A+


Re: imprimer une image tournee

Publié : jeu. 11/nov./2010 10:53
par Backup
Merci :)

c'est vrais que j'avais pas eu le temps de tester avant envoie !

ce code date d'une ancienne version de Purebasic , ou nous pouvions
"ploter" jusqu'au X,Y

depuis la version 4.00 je crois, nous devons "ploter" jusqu'au X-1,Y-1

j'ai corrigé mon code coloré ci dessus , et ajouté un openfilerequester (c'est plus cool) :)

Re: imprimer une image tournee

Publié : jeu. 11/nov./2010 12:05
par G-Rom
Tourner une image n'est pas très compliqué.

tu part de l'image A qui admettons fait 800x600
et tu veut faire une rotation de 90°
le résultat sera dans l'image B qui fera 600x800
- Créer la nouvelle image à la bonne taille
copier chaque pixel de l'image A dans un tableau dim Pixel(800,600)

-Pour chaque pixel dans le tableau Pixel()
-Calculer la distance par rapport au centre ( dist.f = sqr( (PixelX - (800/2))^2 + (PixelY - (600/2))^2 )
-Recalculer la nouvelle position du pixel selon la distance par rapport au centre et selon l'angle de rotation:
nX.f = PixelX + Distance * cos(Angle * #PI/180)
nY.f = PixelY + Distance * sin(Angle * #PI/180)

Voila ;)

Re: imprimer une image tournee

Publié : jeu. 11/nov./2010 12:08
par Parole De JOJO
merci bcp
je vais etudier tout ca

Re: imprimer une image tournee

Publié : dim. 14/nov./2010 17:49
par Parole De JOJO
le seul code qui a marche est celui de venom mais il affiche l'image a l'envers
qu'est ce qu'il faut faire pour la mettre normalement?

Re: imprimer une image tournee

Publié : dim. 14/nov./2010 17:53
par G-Rom
la mettre à l'endroit... :D

suivant l'axe , remplace :
For x = 0 To width -1
par
For x = width -1 to 0 step -1

Re: imprimer une image tournee

Publié : dim. 14/nov./2010 17:56
par Parole De JOJO
ca m'affiche un message d'erreur

Re: imprimer une image tournee

Publié : dim. 14/nov./2010 17:58
par G-Rom
?

Re: imprimer une image tournee

Publié : dim. 14/nov./2010 18:02
par Parole De JOJO
ca marche
merci bcpppppp