I discovered the joys of Fisheyes
for videos, I use an editing app, which suprime this problem
but for photos, I remembered that I have a license Purebasic
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 :
normal use :
batch conversion is include !!