Page 1 sur 1

Calcul dela taille d'un pixel

Publié : mar. 28/août/2007 16:10
par Droopy
Calcul de la taille d'un pixel

Code : Tout sélectionner

;/ PureBasic 4.10b2

Global Ref_Pixel.f,Ref_Surface

Enumeration
  #PANEL
  #MONITEUR
  #DIAGONALE
  #RESOLUTION
  #RATIO
  #DIMENSIONS
  #TAILLEPIXEL
  #DIAG_CM
  #SURFACE
  #STATUSB
  
  #DIFFERENCE_SURFACE
  #TEXTE_REFERENCE
  #TEXTE_COMPARAISON
   
  #MENU
  #REFERENCE
  #AJOUTE
  #SUPPRIME
  #ABOUT
  
  #LARGEURFENETRE=320
  #HAUTEURFENETRE=290
   
EndEnumeration

Procedure CalculHauteur(Diagonale.f,Ratio.f)
  ProcedureReturn Diagonale /Sqr((Ratio*Ratio)+1)
EndProcedure

Procedure Calcul()
  If GetGadgetText(#RESOLUTION)<>"" And GetGadgetText(#DIAGONALE)<>""
    
    Ratio.f=Val(StringField(GetGadgetText(#RESOLUTION),1,"x"))/Val(StringField(GetGadgetText(#RESOLUTION),2,"x"))
    
    Select StrF(Ratio,2)
      Case "1.33"
        SetGadgetText(#RATIO,"Ratio : 4/3")
      Case "1.25"
        SetGadgetText(#RATIO,"Ratio : 5/4")
      Case "1.60"
        SetGadgetText(#RATIO,"Ratio : 16/10")
      Case "1.78"
        SetGadgetText(#RATIO,"Ratio : 16/9")
      Default
        SetGadgetText(#RATIO,"Ratio : "+StrF(Ratio,2))
    EndSelect
    
    Diagonale.f=Val(GetGadgetText(#DIAGONALE))*2.54
    hauteur.f=CalculHauteur(Diagonale,Ratio)
    largeur.f=hauteur*Ratio
    SetGadgetText(#DIMENSIONS,"Largeur x Hauteur : "+StrF(largeur,1)+" x "+StrF(hauteur,1)+" cm")
    DotW.f=largeur/Val(StringField(GetGadgetText(#RESOLUTION),1,"x"))*10
    DotH.f=hauteur/Val(StringField(GetGadgetText(#RESOLUTION),2,"x"))*10
    SetGadgetText(#TAILLEPIXEL,"Taille Pixel : "+StrF(DotW,3)+" x "+StrF(DotH,3)+" mm")
    SetGadgetText(#DIAG_CM,"Diagonale : "+Str(Val(GetGadgetText(#DIAGONALE))*2.54)+" cm")
    SetGadgetText(#SURFACE,"Surface : "+Str(largeur*hauteur)+" cm²")
    
    If Ref_Surface<>0
      
      ;/ Affiche la différence de surface
      diff=(largeur*hauteur)/Ref_Surface*100
      If diff<100
          SetGadgetText(#DIFFERENCE_SURFACE,"Surface : "+Str(diff-100)+"%")
        ElseIf diff=100
          SetGadgetText(#DIFFERENCE_SURFACE,"Surface : Identique")
      ElseIf diff>100
        SetGadgetText(#DIFFERENCE_SURFACE,"Surface : +"+Str(diff-100)+"%")
      EndIf
      
      ;/ Affiche le texte avec comparaison de la taille
      SetGadgetFont(#TEXTE_REFERENCE,LoadFont(0,"Arial",10))
      TailleDiff.f=DotW/Ref_Pixel*10
      SetGadgetFont(#TEXTE_COMPARAISON,LoadFont(1,"Arial",TailleDiff))
    
    EndIf
    
    
  Else
    SetGadgetText(#RATIO,"")
    SetGadgetText(#DIMENSIONS,"")
    SetGadgetText(#TAILLEPIXEL,"")
    SetGadgetText(#DIAG_CM,"")
    SetGadgetText(#SURFACE,"")
  EndIf
  
  
EndProcedure

Procedure Affiche()
  
  ClearGadgetItemList(#RESOLUTION)
  ClearGadgetItemList(#MONITEUR)
  ClearGadgetItemList(#DIAGONALE)
  
  PreferenceGroup("Définitions")
  
  ;/ Diagonale
  index=1
  Repeat
    D.s=StringField(ReadPreferenceString("Diagonale",""),index,",")
    Debug D
    If D=""
      Break
    EndIf
    index+1
    AddGadgetItem(#DIAGONALE,-1,D+Chr(34))
  ForEver
  
  ;/ Résolution
  index=1
  Repeat
    R.s=StringField(ReadPreferenceString("Résolution",""),index,",")
    Debug D
    If R=""
      Break
    EndIf
    index+1
    AddGadgetItem(#RESOLUTION,-1,R)
  ForEver
  
  ;/ Moniteurs
  ExaminePreferenceGroups()
  While NextPreferenceGroup()
    If PreferenceGroupName()<>"Définitions"
      AddGadgetItem(#MONITEUR,-1,PreferenceGroupName())
    EndIf
  Wend
  
  Calcul()
  
EndProcedure

Procedure InitialiseINI()
 
  OpenPreferences(GetPathPart(ProgramFilename())+"dot.ini")
  PreferenceGroup("Définitions")
  If ReadPreferenceString("Diagonale","")=""
    WritePreferenceString("Diagonale","12,15,17,19,20,22,24,28,32")
  EndIf
  
  If ReadPreferenceString("Résolution","")=""
    WritePreferenceString("Résolution","1024x768,1280x1024,1366x768,1440x900,1680x1050,1920x1200")
  EndIf
  
  Affiche()
  
EndProcedure

;{/ Visuel  
#TITRE="Résolution Pixel"
OpenWindow(0,0,0,#LARGEURFENETRE,#HAUTEURFENETRE,#TITRE, #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
CreateGadgetList(WindowID(0))
PanelGadget(#PANEL,10,10,#LARGEURFENETRE-20,#HAUTEURFENETRE-60)
AddGadgetItem(#PANEL,-1,"Définition")
;/ Moniteurs
ComboBoxGadget(#MONITEUR, 10, 10, #LARGEURFENETRE-45,#HAUTEURFENETRE, #PB_ComboBox_Editable)
;/ Taille
ComboBoxGadget(#DIAGONALE, 10, 40, #LARGEURFENETRE-45,#HAUTEURFENETRE, #PB_ComboBox_Editable)
;/ Résolution
ComboBoxGadget(#RESOLUTION, 10, 70, #LARGEURFENETRE-45,#HAUTEURFENETRE, #PB_ComboBox_Editable)
;/ Sortie
TextGadget(#RATIO,10,100,#LARGEURFENETRE-45,20,"")
TextGadget(#DIMENSIONS,10,120,#LARGEURFENETRE-45,20,"")
TextGadget(#TAILLEPIXEL,10,140,#LARGEURFENETRE-45,20,"")
TextGadget(#DIAG_CM,10,160,#LARGEURFENETRE-45,20,"")
TextGadget(#SURFACE,10,180,#LARGEURFENETRE-45,20,"")

;/ 2° Panel
CloseGadgetList()
AddGadgetItem(#PANEL,-1,"Comparaison")
;/ Eléments du 2° Panel
TextGadget(#DIFFERENCE_SURFACE,10,10,#LARGEURFENETRE-45,20,"")
TextGadget(#TEXTE_REFERENCE,10,30,#LARGEURFENETRE-45,20,"Moniteur de référence")
TextGadget(#TEXTE_COMPARAISON,10,80,#LARGEURFENETRE-45,50,"Moniteur de comparaison")

;/ StatusBar
CreateStatusBar(#STATUSB,WindowID(0))

;/ Menu
CreateMenu(#MENU,WindowID(0))
MenuTitle("Moniteur")
MenuItem(#AJOUTE,"Ajouter")
MenuItem(#SUPPRIME,"Supprimer")
MenuBar()
MenuItem(#REFERENCE,"Définir comme référence")
MenuTitle("?")
MenuItem(#ABOUT,"A propos")
;/ Tooltip
GadgetToolTip(#MONITEUR,"Moniteurs définis")
GadgetToolTip(#DIAGONALE,"Diagonale en Pouces")
GadgetToolTip(#RESOLUTION,"Résolution en pixels (Largeur x Hauteur)")
;}

InitialiseINI()

;{/ Gestion des évènements
Repeat 
  evt=WaitWindowEvent()
  Select evt
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #DIAGONALE,#RESOLUTION
          Calcul()
        Case #MONITEUR
          ;/ Lit le fichier INI si un moniteur correspond
          ExaminePreferenceGroups()
          While NextPreferenceGroup()
            If PreferenceGroupName()=GetGadgetText(#MONITEUR)
              SetGadgetText(#DIAGONALE,ReadPreferenceString("Diagonale",""))
              SetGadgetText(#RESOLUTION,ReadPreferenceString("Résolution",""))
              Calcul()
            EndIf
          Wend
          
      EndSelect
    Case #PB_Event_Menu
      Select EventMenu()
        Case #REFERENCE
          If GetGadgetText(#DIAGONALE)<>"" And GetGadgetText(#RESOLUTION)<>""
            If GetGadgetText(#MONITEUR)=""
              StatusBarText(#STATUSB,0,"  Référence : "+GetGadgetText(#DIAGONALE)+"@"+GetGadgetText(#RESOLUTION))
            Else
              StatusBarText(#STATUSB,0,"  Référence : "+GetGadgetText(#MONITEUR)+" ("+GetGadgetText(#DIAGONALE)+"@"+GetGadgetText(#RESOLUTION)+")")
            EndIf
            
              Ratio.f=Val(StringField(GetGadgetText(#RESOLUTION),1,"x"))/Val(StringField(GetGadgetText(#RESOLUTION),2,"x"))
              Diagonale.f=Val(GetGadgetText(#DIAGONALE))*2.54
              hauteur.f=CalculHauteur(Diagonale,Ratio)
              largeur.f=hauteur*Ratio
              Ref_Pixel.f=largeur/Val(StringField(GetGadgetText(#RESOLUTION),1,"x"))*10
              Ref_Surface=largeur*hauteur
            EndIf
              
        
        Case #AJOUTE
          If GetGadgetText(#MONITEUR)<>"" And GetGadgetText(#DIAGONALE)<>"" And GetGadgetText(#RESOLUTION)<>""
            PreferenceGroup(GetGadgetText(#MONITEUR))
            WritePreferenceString("Diagonale",GetGadgetText(#DIAGONALE))
            WritePreferenceString("Résolution",GetGadgetText(#RESOLUTION))
            Affiche()
          EndIf
        Case #SUPPRIME
          If GetGadgetText(#MONITEUR)<>""
            RemovePreferenceGroup(GetGadgetText(#MONITEUR))
            Affiche()
          EndIf
        Case #ABOUT
          MessageRequester(#TITRE,"Programmé en PureBasic")
      EndSelect
      
  EndSelect
Until evt= #PB_Event_CloseWindow

;}


Publié : mar. 28/août/2007 16:22
par Chris
Ah!

Y avait longtemps qu'on avait pas eu un débat sur la taille du pixel :lol:

Publié : mar. 28/août/2007 18:10
par SPH
Oublie pas d'intégrer dans tes calculs la "couleur" du pixel a mesurer car sinon :

Code : Tout sélectionner

InitSprite() 
InitMouse() 
InitKeyboard() 

;SetPriorityClass_ ( GetCurrentProcess_ (), #IDLE_PRIORITY_CLASS ) 

OpenScreen(800,600,32,"") 

StartDrawing(ScreenOutput()) 

Plot(200,300,RGB(255,255,255))
Plot(400,300,RGB(80,80,80))

StopDrawing() 

FlipBuffers(1) 

Repeat
ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_All) 
End 

Publié : mar. 28/août/2007 22:45
par Droopy
J'ai ajouté la possibilité de mémoriser des écrans avec leurs réglages

Publié : jeu. 30/août/2007 15:51
par Droopy
Ajout comparaison visuelle de deux écrans