Pure_defisher

Applications, Games, Tools, User libs and useful stuff coded in PureBasic
User avatar
dobro
Enthusiast
Enthusiast
Posts: 766
Joined: Sun Oct 31, 2004 10:54 am
Location: France
Contact:

Pure_defisher

Post by dobro »

after buying an Olympus camera Tracker
Image

I discovered the joys of Fisheyes Image

for videos, I use an editing app, which suprime this problem
but for photos, I remembered that I have a license Purebasic Image

Here this little code that can remove (at best mitigate)
the fisheye effect of a picture!

Code: Select all

;***********************************************
;Titre  :*Pure_defisher4
;Auteur  : Dobro
;Date  :28/09/2016
;Heure  :10:13:13
;Version Purebasic :  PureBasic 5.50 (Windows - x86)
;Version Purebasic :  (").PureBasic 5.50 (Windows - x64)
;Version de l'editeur :EPB V2.64
; Libairies necessaire : Aucune 
Global Version.s="1.02"
;***********************************************
;48.33
;24.17
;
;19.20
;12.53
;{- Enumerations / DataSections
;{ Windows
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
Enumeration
		#Win
		#file
EndEnumeration
;}
;{ Gadgets
Enumeration
		#Image_0
		#Image_1
		#ScrollBar_Force_x
		#ScrollBar_Force_y
		#ScrollBar_zoom
		#Text_force_x
		#Text_force_x_val
		#Text_force_y
		#Text_force_y_val
		#Text_zoom
		#Text_zoom_val
		#Text_Titre
		#Text_auteur
		#Button_Load
		#Button_Save
		#Button_calcul
		#progress_calcul
		#image_origine
		#image_origine_gadget
		#image_modifie
		#image_modifie_gadget
		#image_modifie2
		#Text_eff_x
		#Text_eff_x_val
		#Text_eff_y
		#Text_eff_y_val
		#Text_version
		#ScrollBar_eff_x
		#ScrollBar_eff_y
		#Button_reset
		#batch_convert
		#Button_Oplympus_small_wide	
		#Text_etirement_x
		#ScrollBar_etirement_x
		#Text_etirement_x_val
		#Text_etirement_y
		#ScrollBar_etirement_y
		#Text_etirement_y_val
EndEnumeration
;}
;{ Fonts
Enumeration
		#Font_Text_Titre
EndEnumeration
;}
;{ Images
Enumeration
		#Image_Image_0
		#Image_Image_1
EndEnumeration
;}
Structure image_file
		image_file.s
		image_file_batch.s
		repertoire_sortie.s
		here.s
		name_image.s
		extens_image.s
		Largeur_image.i
		hauteur_image.i
		pos_curs_force_x.i
		pos_curs_force_y.i
		pos_curs_zoom.d
		etirement_x.d
		etirement_y.d
		eff_x.i
		eff_y.i
		image_modifie_larg.i
		image_modifie_haut.i
EndStructure
Global image_file.image_file
Global Dim Image_or.d(1,1)
Global Dim Image_res.d(1,1)
image_file\pos_curs_zoom.d=1
; **********************************
;-declaration Procedures
Declare openwindow_win()
Declare calcul()
Declare save(flag)
Declare load(flag)
Declare save_ini()
Declare load_ini()
Declare aff_val()

; **********************************
Define.l Event
;}
Load_ini()
OpenWindow_Win()
SetGadgetState(#ScrollBar_Force_x,image_file\pos_curs_force_x)
SetGadgetState(#ScrollBar_Force_y,image_file\pos_curs_force_y)
SetGadgetState(#ScrollBar_zoom,curs.d)
image_file\etirement_x.d =1
image_file\etirement_y.d =1
aff_val()



;{- Event loop
Repeat
		Event = WaitWindowEvent(12)
		Select Event
				; ///////////////////
		Case #PB_Event_Gadget
				Select EventGadget()
				Case #Image_0
				Case #Image_1
				Case #batch_convert
						;-bath_convert
						image_file\image_file_batch.s=OpenFileRequester("choisir Les images a convertir",image_file\here.s,"*.jpg;*.png;*.bmp",1,#PB_Requester_MultiSelection)
						image_file\repertoire_sortie.s=PathRequester("indiquez le repertoire de sortie",image_file\here.s)
						While image_file\image_file_batch.s
								;Debug image_file\image_file_batch.s
								SetWindowTitle(#win,"calcul img:"+image_file\image_file_batch.s)
								image_file\image_file.s=image_file\image_file_batch.s
								;load image en cours
								Load(#true)
								;calcul
								Calcul()
								image_file\image_file_batch.s = NextSelectedFileName()
								save(#True)
						Wend
				Case #scrollbar_eff_x
						;-effet_x
						image_file\eff_x.i= GetGadgetState(#Scrollbar_eff_x)
						aff_val()
				Case #scrollbar_eff_y
						;-effet_y
						image_file\eff_y.i= GetGadgetState(#Scrollbar_eff_y)
						aff_val()
				Case #ScrollBar_Force_x
						;-force_x
						image_file\pos_curs_force_x.i = GetGadgetState(#scrollbar_force_x)
						aff_val()
				Case #ScrollBar_Force_y
						;-force_y
						image_file\pos_curs_force_y.i = GetGadgetState(#scrollbar_force_y)
						aff_val()
				Case #ScrollBar_zoom
						;-zoom						
						curs.d=GetGadgetState(#scrollbar_zoom)
						image_file\pos_curs_zoom.d=curs.d
						if isimage(#image_modifie)								
								image_file\image_modifie_larg.i=ImageWidth(#image_modifie)
								image_file\image_modifie_haut.i=Imageheight(#image_modifie)
								
								ResizeImage(#image_modifie,image_file\image_modifie_larg.i+curs.d,image_file\image_modifie_haut.i+curs.d)
								GrabImage(#image_modifie,#image_modifie2,curs.d,curs.d,image_file\image_modifie_larg.i-curs.d, image_file\image_modifie_haut.i-curs.d)
								CopyImage(#image_modifie2,#image_modifie_gadget)
								ResizeImage(#image_modifie_gadget,GadgetWidth(#Image_0),GadgetHeight(#Image_0))
								SetGadgetState(#Image_1, imageId(#image_modifie_gadget))
								image_file\image_modifie_larg.i=ImageWidth(#image_modifie)
								image_file\image_modifie_haut.i=Imageheight(#image_modifie)
								SetGadgetState(#ScrollBar_etirement_x,1)
								SetGadgetState(#ScrollBar_etirement_y,1)
						endif
						
						aff_val()
				Case #ScrollBar_etirement_x
						
						image_file\image_modifie_larg.i=ImageWidth(#image_modifie)
						image_file\image_modifie_haut.i=Imageheight(#image_modifie)
						
						image_file\etirement_x.d=GetGadgetState(#scrollbar_etirement_x)
						cursx.d= image_file\etirement_x.d
						if isimage(#image_modifie)
								
								ResizeImage(#image_modifie,image_file\image_modifie_larg.i+cursx.d, #pb_ignore)
								GrabImage(#image_modifie,#image_modifie2,cursx.d,cursy.d,image_file\image_modifie_larg.i-cursx.d, image_file\image_modifie_haut.i-cursy.d)
								CopyImage(#image_modifie2,#image_modifie_gadget)
								ResizeImage(#image_modifie_gadget,GadgetWidth(#Image_0),GadgetHeight(#Image_0))
								SetGadgetState(#Image_1, imageId(#image_modifie_gadget))				
								image_file\image_modifie_larg.i=ImageWidth(#image_modifie)
								image_file\image_modifie_haut.i=Imageheight(#image_modifie)
								
								SetGadgetState(#ScrollBar_zoom,1)
						endif
						
				Case #ScrollBar_etirement_y
						image_file\image_modifie_larg.i=ImageWidth(#image_modifie)
						image_file\image_modifie_haut.i=Imageheight(#image_modifie)
						image_file\etirement_y.d=GetGadgetState(#scrollbar_etirement_y)
						cursy.d= image_file\etirement_y.d
						if isimage(#image_modifie)
								
								ResizeImage(#image_modifie, #pb_ignore, image_file\image_modifie_haut.i+cursy.d)
								GrabImage(#image_modifie,#image_modifie2,cursx.d,cursy.d,image_file\image_modifie_larg.i-cursx.d, image_file\image_modifie_haut.i-cursy.d)
								CopyImage(#image_modifie2,#image_modifie_gadget)
								ResizeImage(#image_modifie_gadget,GadgetWidth(#Image_0),GadgetHeight(#Image_0))
								SetGadgetState(#Image_1, imageId(#image_modifie_gadget))											
								
								image_file\image_modifie_larg.i=ImageWidth(#image_modifie)
								image_file\image_modifie_haut.i=Imageheight(#image_modifie)
								SetGadgetState(#ScrollBar_zoom,1)
						endif
				Case #Text_force_x
				Case #Text_Force_y
						
				Case #Text_Titre
				Case #Text_auteur
				Case #Button_reset
						;-reset
						
						SetGadgetState(#ScrollBar_Force_x,10000/2)
						SetGadgetState(#ScrollBar_Force_y,10000/2)
						
						SetGadgetState(#Scrollbar_eff_x,image_file\Largeur_image/2)
						SetGadgetState(#ScrollBar_eff_y,image_file\Hauteur_image/2)
						image_file\eff_x.i=GetGadgetState(#Scrollbar_eff_x)
						image_file\eff_y.i=GetGadgetState(#Scrollbar_eff_y)
						image_file\pos_curs_force_x.i=GetGadgetState(#Scrollbar_eff_x)
						image_file\pos_curs_force_y.i=GetGadgetState(#Scrollbar_eff_y)
						aff_val()
				Case #Button_Load
						;-load
						Load(#false)
				Case #Button_Save
						;-Save
						save(#false)
				Case #Button_calcul
						;-calcul
						Calcul()
				Case #Button_Oplympus_small_wide
						; Tg-Tracker
						;48.33
						;24.17
						;
						;19.20
						;12.53
						;(3840x2160)
						
						
						
						image_file\pos_curs_force_x.i=4833
						image_file\pos_curs_force_y.i=2417
						ecx.d=3840/1920
						ecy.d=2160/1253
						image_file\eff_x.i=image_file\largeur_image.i/ecx.d
						image_file\eff_y.i=image_file\hauteur_image.i/ecy.d
						SetGadgetState(#ScrollBar_Force_x,image_file\pos_curs_force_x.i)
						SetGadgetState(#ScrollBar_Force_y,image_file\pos_curs_force_y.i)						
						SetGadgetState(#Scrollbar_eff_x,image_file\eff_x.i)
						SetGadgetState(#ScrollBar_eff_y,image_file\eff_y.i)
						aff_val()
						
						
						
				EndSelect
				; ////////////////////////
		Case #PB_Event_CloseWindow
				Select EventWindow()
				Case #Win
						Save_ini()
						CloseWindow(#Win)
						Break
				EndSelect
		EndSelect
Forever
;
;}
;- Procedures Zone
Procedure OpenWindow_Win()
		If OpenWindow(#Win, 271, 98, 886, 550, "Pure_defisher by Dobro", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
				;;If CreateGadgetList(WindowID(#Win))
				ImageGadget(#Image_0, 430, 10, 325, 235, 0, #PB_Image_Border)
				ImageGadget(#Image_1, 430, 270, 325, 235, 0, #PB_Image_Border)
				TextGadget(#Text_force_x, 20, 80, 100, 20, "Force Horizontal")
				ScrollBarGadget(#ScrollBar_Force_x, 150, 80, 200, 15, 1, 10000, 1000)
				TextGadget(#Text_force_x_val, 360, 80, 50, 20, "0")
				TextGadget(#Text_force_y, 20, 100, 100, 20, "Force Vertical")
				ScrollBarGadget(#ScrollBar_Force_y, 150, 100, 200, 15, 1, 10000, 1000)
				TextGadget(#Text_force_y_val, 360, 100, 50, 20, "0")
				TextGadget(#Text_zoom, 20, 120, 100, 20, "Zoom")
				ScrollBarGadget(#ScrollBar_zoom, 150, 120, 200, 15, 1, 300, 10)
				TextGadget(#Text_zoom_val, 360, 120, 50, 20, "0")
				TextGadget(#Text_eff_x, 20, 140, 100, 20, "effect x")
				ScrollBarGadget(#ScrollBar_eff_x, 150,140, 200, 15, 1, 30, 10)
				TextGadget(#Text_eff_x_val, 360, 140, 50, 20, "0")
				TextGadget(#Text_eff_y, 20, 160, 100, 20, "effect y")
				ScrollBarGadget(#ScrollBar_eff_y, 150, 160, 200, 15, 1, 30, 10)
				TextGadget(#Text_eff_y_val, 360, 160, 50, 20, "0")
				
				TextGadget(#Text_etirement_x, 20, 180, 100, 20, "stretch x")
				ScrollBarGadget(#ScrollBar_etirement_x, 150, 180, 200, 15, 1, 300, 10)
				TextGadget(#Text_etirement_x_val, 360, 180, 50, 20, "0")
				;
				TextGadget(#Text_etirement_y, 20, 200, 100, 20, "stretch y")
				ScrollBarGadget(#ScrollBar_etirement_y, 150,200, 200, 15, 1,300, 10)
				TextGadget(#Text_etirement_y_val, 360, 200, 50, 20, "0")
				
				
				ButtonGadget(#Button_reset, 20, 230, 100, 25, "reset")
				ButtonGadget(#Button_Oplympus_small_wide, 20, 260, 100, 25, "TG-tracker")
				
				
				TextGadget(#Text_Titre, 100, 15, 180, 40, "Pure_Defisher")
				TextGadget(#Text_version, 300, 15, 50, 40,Version.s )
				TextGadget(#Text_auteur, 245, 55, 50, 20, "By Dobro")
				ButtonGadget(#Button_calcul, 10, 375, 55, 50, "Calcul")
				ProgressBarGadget(#progress_calcul, 70, 375+35,150, 15, 1, 100)
				ButtonGadget(#Button_Load, 10, 440, 80, 25, "Load")
				ButtonGadget(#Button_Save, 10, 470, 80, 25, "Save")
				ButtonGadget(#batch_convert,130, 470, 80, 25, "Batch_convert")
				
				DisableGadget(#batch_convert, #true)
				; Gadget Fonts
				SetGadgetFont(#Text_Titre, LoadFont(#Font_Text_Titre, "Arial", 20, #PB_Font_HighQuality))
				;EndIf
		EndIf
EndProcedure
Procedure Calcul()
		Save_ini()
		if IsImage(#image_origine)
				; defisher
				halfWidth.d=image_file\Largeur_image-GetGadgetState(#scrollbar_eff_x);image_file\Largeur_image/2
				halfHeight.d=GetGadgetState(#scrollbar_eff_y);image_file\hauteur_image/2
				strength_x.d=GetGadgetState(#ScrollBar_Force_x)/1000
				strength_y.d=GetGadgetState(#ScrollBar_Force_y)/1000
				
				if strength_x.d = 0 : strength_x.d = 0.00001:Endif
				if strength_y.d = 0 : strength_y.d = 0.00001:Endif
				correctionRadius_x.d =(pow(image_file\Largeur_image , 2) +pow(image_file\hauteur_image , 2)) / strength_x.d
				correctionRadius_y.d =(pow(image_file\Largeur_image , 2) +pow(image_file\hauteur_image , 2)) / strength_y.d
				; ***************************************************
				CreateImage(#image_modifie, image_file\Largeur_image,image_file\hauteur_image)
				StartDrawing(ImageOutput(#image_modifie))
						For x=1 to image_file\Largeur_image-1
								For y=1 to image_file\hauteur_image-1
										newX.d = x - halfWidth.d  ;v
										newY.d = y - halfHeight.d ; h
										
										distance.d = pow(newX.d ,2) +pow( newY.d ,2)
										r_x.d = (distance.d / correctionRadius_x.d)
										r_y.d = (distance.d / correctionRadius_y.d)
										if r_x.d <> 0 or r_y.d<>0
												;(TAN arrondis /// Atan creuse )
												theta_x.d=ATAN(r_x.d )/r_x.d
												theta_y.d=ATAN(r_y.d )/r_y.d
												
												
												
												sourceX = halfWidth.d + (theta_x.d *( newX.d ) )
												sourceY = halfHeight.d + ((theta_y.d ) *( newY.d) )
												if (sourceX>1 and  sourceY>1) and (sourceX<image_file\largeur_image and sourceY<image_file\hauteur_image)
														plot (x,y,Image_or(sourceX,sourceY))
												Endif
										Endif
								Next y
								SetGadgetState(#progress_calcul, x)
								; UpdateWindow_(GadgetID(#progress_calcul))
								WaitWindowEvent(2)
						Next x
				StopDrawing()
				; ***************************************************
				
				curs.d=GetGadgetState(#scrollbar_zoom)
				ResizeImage(#image_modifie,image_file\Largeur_image+curs.d, image_file\hauteur_image+curs.d)
				GrabImage(#image_modifie,#image_modifie2,curs.d,curs.d,image_file\Largeur_image-curs.d, image_file\hauteur_image-curs.d)
				CopyImage(#image_modifie2,#image_modifie_gadget)
				ResizeImage(#image_modifie_gadget,325,235)
				SetGadgetState(#Image_1, imageId(#image_modifie_gadget))
				SetGadgetState(#progress_calcul, 0)
				UpdateWindow_(GadgetID(#Image_1))
				UpdateWindow_(GadgetID(#progress_calcul))
				DisableGadget(#batch_convert, #False)
		Endif
Endprocedure
Procedure Save(flag)
		CopyImage(#image_modifie2,#image_modifie)
		FreeImage(#image_modifie2)
		if flag=#false
				path_save.s=SaveFileRequester("ou sauver ?" ,image_file\here.s+image_file\name_image.s+"."+image_file\extens_image.s,"*.jpg;*.png;*.bmp",1)
		Else
				path_save.s=image_file\repertoire_sortie.s+image_file\name_image.s+"."+image_file\extens_image.s
		Endif
		select LCase(image_file\extens_image.s)
				Case "jpg"
						SaveImage(#image_modifie,path_save.s,#PB_ImagePlugin_JPEG,10)
				case "bmp"
						SaveImage(#image_modifie,path_save.s,#PB_ImagePlugin_BMP)
				case "png"
						SaveImage(#image_modifie,path_save.s,#PB_ImagePlugin_PNG)
				EndSelect
		Endprocedure
		Procedure Load(flag)
				
				load_ini()
				if flag=#false
						image_file\image_file.s=OpenFileRequester("choisir une image",image_file\here.s,"*.jpg;*.png;*.bmp",1)
				Endif
				if  image_file\image_file.s<>""
						image_file\here.s=GetPathPart( image_file\image_file.s)
						image_file\name_image.s=GetFilePart( image_file\image_file.s,#PB_FileSystem_NoExtension)
						image_file\extens_image.s=GetExtensionPart( image_file\image_file.s)
						If LoadImage(#image_origine, image_file\image_file.s)
								image_file\Largeur_image=ImageWidth(#image_origine)
								image_file\hauteur_image=ImageHeight(#image_origine)
								CopyImage(#image_origine,#image_origine_gadget)
								ResizeImage(#image_origine_gadget,325,235)
								SetGadgetState(#Image_0, imageId(#image_origine_gadget))
								SetGadgetAttribute(#progress_calcul, #PB_ProgressBar_Maximum, image_file\hauteur_image)
								SetGadgetAttribute(#scrollbar_eff_x,#PB_ScrollBar_Maximum   , image_file\Largeur_image)
								SetGadgetAttribute(#scrollbar_eff_y,#PB_ScrollBar_Maximum   , image_file\Hauteur_image)
								SetGadgetState(#Scrollbar_eff_x,image_file\eff_x)
								SetGadgetState(#ScrollBar_eff_y,image_file\eff_y)
								
								SetGadgetState(#ScrollBar_Force_x,image_file\pos_curs_force_x.i )
								SetGadgetState(#ScrollBar_Force_y,image_file\pos_curs_force_y.i )
								
								SetGadgetAttribute(#scrollbar_etirement_x,#PB_ScrollBar_Maximum   ,image_file\Largeur_image/10)
								SetGadgetAttribute(#scrollbar_etirement_y,#PB_ScrollBar_Maximum   ,image_file\hauteur_image/10)
								
								
								
								;
								Dim Image_or.d(image_file\Largeur_image,image_file\hauteur_image)
								Dim Image_res.d(image_file\Largeur_image,image_file\hauteur_image)
								; Scan
								StartDrawing(ImageOutput(#image_origine))
										For y=1 to image_file\hauteur_image-1
												For x=1 to image_file\Largeur_image-1
														Image_or(x,y)=point(x,y)
												Next x
										Next y
								StopDrawing()
						Else
								MessageRequester("erreur", "pas pu charger cette image !")
						Endif
				Endif
		EndProcedure
		procedure Save_ini()
				If Openfile(#file,GetCurrentDirectory()+"Pure_defisher.ini")
								;-save_ini
								writeStringN(#file,image_file\here.s)
								WriteInteger(#file,GetGadgetState(#ScrollBar_Force_x))
								WriteInteger(#file,GetGadgetState(#ScrollBar_Force_y))
								WriteFloat(#file,image_file\pos_curs_zoom.d)
								WriteInteger(#file,image_file\eff_x.i)
								WriteInteger(#file,image_file\eff_y.i)
						CloseFile(#file)
				Else
						image_file\here.s=GetCurrentDirectory()
Endif;]
EndProcedure
Procedure load_ini()
		if FileSize(GetCurrentDirectory()+"Pure_defisher.ini")>1
				If Openfile(#file,GetCurrentDirectory()+"Pure_defisher.ini")
								image_file\here.s=ReadString(#file)
								image_file\pos_curs_force_x=ReadInteger(#file)
								image_file\pos_curs_force_y=ReadInteger(#file)
								curs.d=ReadFloat(#file)
								image_file\pos_curs_zoom.d=curs.d
								image_file\eff_x.i=ReadInteger(#file)
								image_file\eff_y.i=ReadInteger(#file)
						CloseFile(#file)
						
				Endif
		Else
		image_file\here.s=GetCurrentDirectory();|
		Endif
EndProcedure
Procedure aff_val()
		SetGadgettext(#Text_force_x_val,StrF(image_file\pos_curs_force_x/100,2))
		SetGadgettext(#Text_force_y_val,StrF(image_file\pos_curs_force_y/100,2))
		SetGadgettext(#text_zoom_val,str(image_file\pos_curs_zoom.d))
		SetGadgettext(#text_eff_x_val,strF(image_file\eff_x.i/100,2 ))
		SetGadgettext(#text_eff_y_val,strF(image_file\eff_y.i/100 ,2))
Endprocedure
;Epb









Extrem sample :
Image


normal use :
Image


batch conversion is include !!
Last edited by dobro on Sat Oct 01, 2016 8:59 pm, edited 4 times in total.
Image
Windows 98/7/10 - PB 5.42
■ sites : http://michel.dobro.free.fr/
User avatar
Mijikai
Addict
Addict
Posts: 1360
Joined: Sun Sep 11, 2016 2:17 pm

Re: Pure_defisher

Post by Mijikai »

looks great :D
thx for sharing
User avatar
RSBasic
Moderator
Moderator
Posts: 1218
Joined: Thu Dec 31, 2009 11:05 pm
Location: Gernsbach (Germany)
Contact:

Re: Pure_defisher

Post by RSBasic »

Looks good Image
Image
Image
User avatar
dobro
Enthusiast
Enthusiast
Posts: 766
Joined: Sun Oct 31, 2004 10:54 am
Location: France
Contact:

Re: Pure_defisher

Post by dobro »

Thanks :)

new version is coming soon ...
Image
Windows 98/7/10 - PB 5.42
■ sites : http://michel.dobro.free.fr/
User avatar
dobro
Enthusiast
Enthusiast
Posts: 766
Joined: Sun Oct 31, 2004 10:54 am
Location: France
Contact:

Re: Pure_defisher

Post by dobro »

code updated :)

adding 2 sliders to play on the deformation Vertical and / or horizontal
adding a batch mode for batch conversion (with the current parameters)
must be calculated at least one image before you can enable batch

except the zoom, if you change a cursor
you must restart the calculation .. ;)
Image
Windows 98/7/10 - PB 5.42
■ sites : http://michel.dobro.free.fr/
User avatar
Andre
PureBasic Team
PureBasic Team
Posts: 2056
Joined: Fri Apr 25, 2003 6:14 pm
Location: Germany (Saxony, Deutscheinsiedel)
Contact:

Re: Pure_defisher

Post by Andre »

Very cool, thanks :D
Bye,
...André
(PureBasicTeam::Docs & Support - PureArea.net | Order:: PureBasic | PureVisionXP)
Denis
Enthusiast
Enthusiast
Posts: 704
Joined: Fri Apr 25, 2003 5:10 pm
Location: Doubs - France

Re: Pure_defisher

Post by Denis »

Salut Dobro,

it seems to be good 8)
A+
Denis
walbus
Addict
Addict
Posts: 929
Joined: Sat Mar 02, 2013 9:17 am

Re: Pure_defisher

Post by walbus »

@dobro
A nice tricky code, simple to understand and efficient !

At the some way, it should, i think, a way for dissortion correction

A further way is, setting bezier lines with variable nodes
User avatar
dobro
Enthusiast
Enthusiast
Posts: 766
Joined: Sun Oct 31, 2004 10:54 am
Location: France
Contact:

Re: Pure_defisher

Post by dobro »

walbus wrote: A further way is, setting bezier lines with variable nodes
sorry, my maximum level in mathematics
is reached ! :lol:

modified code :)
Adding 2 sliders to stretch the image horizontally or vertically (useful to frame some pictures)
Adding a button that automatically rule to correct the lens of the Olympus TG-tracker

@Denis , Merci Denis :)
Image
Windows 98/7/10 - PB 5.42
■ sites : http://michel.dobro.free.fr/
Post Reply