Page 1 sur 1

resize mais plus précis

Publié : jeu. 17/mars/2011 12:50
par Fortix
bonjours :D
j'ai là un code pour redimentionner une image de façon proportionné
mais il y a des imperfections lors de la redim!!!

Code : Tout sélectionner

DIMIMG=700

fichier_$ = OpenFileRequester( "Recherche image", GetPathPart(fichier_$), "Fichier image|*.jpg;*.jpeg;*.png;*.bmp;*.tif;*.tga", 0)
        ;fs = FileSize(fichier_$)  
                    
        If fichier_$ And fs>10
            If LoadImage( 1, fichier_$)    
                pds = ImageDepth(1)

                L.f = ImageWidth(1)    
                H.f = ImageHeight(1)

If H<>DIMIMG And L<>DIMIMG
                    If L>H Or L=H
                        If H > DIMIMG Or H < DIMIMG 
                            S=DIMIMG*100
                            SS=S/H
                            H=DIMIMG
                                                    
                            T=L*SS
                            L=T/100
                            ff=1                               
                        EndIf
                                    
                        If L > DIMIMG Or L < DIMIMG
                            d=DIMIMG*100
                            dd=d/L
                            L=DIMIMG
                                                    
                            T=H*dd
                            H=T/100
                            ww=1                                                                                   
                        EndIf  
                    Else
                        If L > DIMIMG Or L < DIMIMG
                            d=DIMIMG*100
                            dd=d/L
                            L=DIMIMG
                                                    
                            T=H*dd
                            H=T/100 
                            w=1                                                                                
                        EndIf 
                                    
                        If H > DIMIMG Or H < DIMIMG 
                            S=DIMIMG*100
                            SS=S/H
                            H=DIMIMG
                                                    
                            T=L*SS
                            L=T/100
                            f=1                               
                        EndIf                              
                    EndIf  
                EndIf
                            
                If w And f Or ww And ff
                    Round(L,0):Round(H,0)
                EndIf 
                      
                ResizeImage(1,L,H,#PB_Image_Smooth)
comme vous le voyez; 700 est la limite à ne pas depacer que se soit en hauteur ou en largeur
donc si vous connaissez une autre façon, surtout n'hezitez pas :lol:

merci à vous :D

Re: resize mais plus précis

Publié : jeu. 17/mars/2011 13:37
par Ar-S
Voilà ma procédure de redimensionnement.

Code : Tout sélectionner


;modifie la taille de sortie par défaut
Global TailleL.l=1024 
Global TailleH.l=768
Global L.l,H.l,Limg.l,Himg.l

;(.....code)


      Limg=ImageWidth(#IMG)
      Himg=ImageHeight(#IMG)
      Debug "Image chargée ! X : "+Str(Limg)+"     Y : "+Str(Himg)
     
      ; Calcule de la taille des images de destination.
      ; ça permet d'adapter la taille en fonction du format paysage/portrait
      If Limg>Himg
        L=TailleL
        H=(Himg*TailleL)/Limg
        Debug " Resolution de sortie :"
        Debug " X : "+Str(L)+"         Y : "+Str(H)
      ElseIf Himg>Limg
        H=TailleH
        L=(Limg*TailleH)/Himg
        Debug " Resolution de sortie :"
        Debug " X : "+Str(L)+"         Y : "+Str(H)
       
      ElseIf Limg=Himg 
        H=TailleH
        L=TailleH ; H car doit faire la Hauteur en taille car les écrans sont plus large que haut...
        Debug " Resolution de sortie :"
        Debug " X : "+Str(L)+"         Y : "+Str(H)
      Else
        Debug "erreur redimensionnement"
      EndIf
      ;- Redimensionnement de l'image
      ResizeImage(#IMG,L,H,#PB_Image_Smooth)

Re: resize mais plus précis

Publié : ven. 18/mars/2011 11:26
par Fortix
Merci @Ar-S :D
faudrait qu'à l'avenir je planifis mes créations plus soigneusement :lol:

Re: resize mais plus précis

Publié : ven. 18/mars/2011 12:53
par flaith
[HS]@Fortix: j’adore l'image de ton avatar :D[/HS]

Re: resize mais plus précis

Publié : ven. 18/mars/2011 14:01
par case
ma version qui permet pas mal de manipulations sous forme de valeurs absolues ou de pourcentages

Code : Tout sélectionner

; +--------------------------------------+
; |   code par case @ purebasic forums   |
; |   case[at]moonshade.org                 |
; +--------------------------------------+
; |procedure de redimentionnement d'image|
; +--------------------------------------+
; |              parametres :            |
; +--------------------------------------+
; |Image   , image a redimentionner      |
; |Largeur , largeur de l'image en sortie|
; |Hauteur , hauteur de l'image de sortie|
; |Options : #proportion : conserve les  |
; |                        proportions   |
; |          #Raw : n'adouci pas l'image |
; |                 pendant le           |
; |                 redimentinnement     |
; |          #copie : crée une copie de  |
; |                   l'image et conserve|
; |                   l'originale        |
; |          #Pourcent : la taille est   |
; |                     exprimee en      |
; |                     pourcentage      |
; +--------------------------------------+
; | si largeur ou hauteur =0             |
; | le redimentionnement est             |
; | obligatoirement proportionel         |
; |                                      |
; | si le redimentionnement est          |
; | proportionel et que les deux tailles |
; | sont indiquées, la largeur est       |
; | utilisée comme référence             |
; |                                      |
; | si Largeur et hauteur =0 pas de redim|
; +--------------------------------------+
; constantes
#Raw        =%1
#Proportion =%10
#copie      =%100
#pourcentage=%1000
; declaration procedure
Declare Resize(Image,Largeur,Hauteur=0,Options.b=0)
;
;
;-------------------------------------------------------------------------------------
; exemple
UsePNGImageDecoder():UseJPEGImageDecoder()
img=LoadImage(#PB_Any,OpenFileRequester("choisissez une image","","*.*",0))
;
;
;
If IsImage(img) ; une image valide a été chargée
  Debug "taille image d'origine:"+Str(ImageWidth(img))+"x"+Str(ImageHeight(img))  
  pic=Resize(img,50,0,#Proportion|#copie|#pourcentage)
  Debug "redimentionnement de l'image effectué 50% proportionel sur une copie"
  Debug "taille image d'origine :"+Str(ImageWidth(img))+"x"+Str(ImageHeight(img))
  If pic<>img ; nouvelle image crée
    Debug "taille image de la copie :"+Str(ImageWidth(pic))+"x"+Str(ImageHeight(pic))
  EndIf
  ;
  FreeImage(pic)
  pic=Resize(img,50,0,#Proportion|#copie)
  Debug "redimentionnement de l'image effectué 50 pixel de large proportionel sur une copie"
  Debug "taille image d'origine :"+Str(ImageWidth(img))+"x"+Str(ImageHeight(img))
  If pic<>img ; nouvelle image crée
    Debug "taille image de la copie :"+Str(ImageWidth(pic))+"x"+Str(ImageHeight(pic))
  EndIf
  ;
  FreeImage(pic)
  pic=Resize(img,0,200,#pourcentage|#Proportion|#copie)
  Debug "redimentionnement de l'image effectué 200% de haut proportionel sur une copie"
  Debug "taille image d'origine :"+Str(ImageWidth(img))+"x"+Str(ImageHeight(img))
  If pic<>img ; nouvelle image crée
    Debug "taille image de la copie :"+Str(ImageWidth(pic))+"x"+Str(ImageHeight(pic))
  EndIf
  ;
  FreeImage(pic)
  pic=Resize(img,150,200,#pourcentage|#copie)
  Debug "redimentionnement de l'image effectué 200% de haut & 150% de large proportionel sur une copie"
  Debug "taille image d'origine :"+Str(ImageWidth(img))+"x"+Str(ImageHeight(img))
  If pic<>img ; nouvelle image crée
    Debug "taille image de la copie :"+Str(ImageWidth(pic))+"x"+Str(ImageHeight(pic))
  EndIf
   ;
  FreeImage(pic)
  pic=Resize(img,150,200)
  Debug "redimentionnement de l'image d'origine effectuée 150x200"
  Debug "taille image d'origine :"+Str(ImageWidth(img))+"x"+Str(ImageHeight(img))
  If pic<>img ; nouvelle image crée
    Debug "taille image de la copie :"+Str(ImageWidth(pic))+"x"+Str(ImageHeight(pic))
  EndIf 
EndIf
; procedure
Procedure Resize(Image,Largeur,Hauteur=0,options.b=0)  
  If IsImage(Image)=0
    Debug "erreur 'image innexistante'"
    ProcedureReturn
  EndIf
  If ((options<<5 &$ff)>>7 )=1 ; #copie 
    Image=CopyImage(Image,#PB_Any) ; on crée une copie de l'image qu'on utilise en place de la source
  EndIf
  If IsImage(Image)=0
    Debug "erreur 'image innexistante'"
    ProcedureReturn
  EndIf
  ;
  Mul_l.f ; multiplicateur largeur
  mul_h.f ; multiplicateur hauteur
  Largeur_Source=ImageWidth(Image)
  Hauteur_Source=ImageHeight(Image)
  
  ;
  If Largeur=0 And Hauteur=0 ; taille =0x0 pas de redimentionnement
    Debug "erreur 'taille 0x0'"
    ProcedureReturn 
  EndIf
  If Largeur=0  ; la hauteur est utilisée comme référence
    If ((options<<4 &$ff)>>7 )=1 ;pourcentage
      mul_l=Hauteur/100.0
      mul_h=Mul_l
    Else       
      mul_l=Hauteur/Hauteur_Source
      mul_h=Mul_l
    EndIf
  EndIf
  If hauteur=0  ; la largeur est utilisée comme référence
    If ((options<<4 &$ff)>>7 )=1 ;pourcentage
      mul_l=Largeur/100.0
      mul_h=Mul_l      
    Else       
      mul_l=Largeur/Largeur_Source
      mul_h=Mul_l
    EndIf   
  EndIf  
  If hauteur>0 And largeur >0       ;les deux dimensions sont fournie
    ;
    If ((options<<6 &$ff)>>7 )=1     ; mode proportionel (par defaut)
      If ((options<<4 &$ff)>>7 )=1 ;pourcentage
        mul_l=Largeur/100.0
        mul_h=Mul_l        
      Else               
        mul_l=Largeur/Largeur_Source   ; on calcul le multiplicateur pour la largeur
        mul_h=Mul_l                    ; qu'on utilise pour la hauteur
      EndIf      ;
    Else                             ; mode non proportionel 
      If ((options<<4 &$ff)>>7 )=1 ;pourcentage
        mul_h=Hauteur/100.0        
        mul_l=Largeur/100.0
      Else               
        mul_l=Largeur/Largeur_Source   ; on calcul le multiplicateur pour la largeur
        mul_h=Hauteur/Hauteur_Source   ; et celui pour la hauteur
      EndIf
    EndIf
  EndIf
  ResizeImage(Image,Largeur_Source*Mul_l,Hauteur_Source*mul_h,((options<<7 &$ff)>>7 )) ; redimentionnement de l'image
  ProcedureReturn Image
EndProcedure

Re: resize mais plus précis

Publié : mer. 23/mars/2011 12:22
par Fortix
Merci @flaith :D

j'en demandais pas tant @case :lol:
merci en touts cas :D, ta version est très
compliqué :?
toujours bon à décortiquer et à comprendre :lol:

Re: resize mais plus précis

Publié : mer. 23/mars/2011 13:47
par Mindphazer
Je ne dirai pas "compliqué"
Plutôt "complet" et "complexe"......