imprimer une image tournee

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

imprimer une image tournee

Message 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
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: imprimer une image tournee

Message par Warkering »

Peut-être en effectuant une rotation pixel par pixel?
Avatar de l’utilisateur
venom
Messages : 3138
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: imprimer une image tournee

Message 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


@++
Dernière modification par venom le dim. 14/nov./2010 21:43, modifié 1 fois.
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: imprimer une image tournee

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: imprimer une image tournee

Message par Backup »

.................
Dernière modification par Backup le dim. 20/mars/2011 13:41, modifié 1 fois.
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: imprimer une image tournee

Message par Warkering »

Et PAF! Maître Dobro a encore frappé un gros coup de sa Connaissance! :mrgreen:
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: imprimer une image tournee

Message 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+

Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: imprimer une image tournee

Message 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) :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: imprimer une image tournee

Message 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 ;)
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: imprimer une image tournee

Message par Parole De JOJO »

merci bcp
je vais etudier tout ca
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: imprimer une image tournee

Message 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?
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: imprimer une image tournee

Message 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
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: imprimer une image tournee

Message par Parole De JOJO »

ca m'affiche un message d'erreur
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: imprimer une image tournee

Message par G-Rom »

?
Parole De JOJO
Messages : 446
Inscription : mar. 25/mai/2010 17:24
Localisation : Bnei Brak, Israel

Re: imprimer une image tournee

Message par Parole De JOJO »

ca marche
merci bcpppppp
Répondre