Page 1 sur 2

ResizeImage successif

Publié : mar. 29/juil./2014 14:49
par falsam
■ Avec ce code je réduis une image de 298x472 en une image en 128x128

Code : Tout sélectionner

Enumeration
  #Mainform
  #Image
EndEnumeration

UseJPEGImageDecoder()
image  = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\3D\Data\Textures\ValetCoeur.jpg")

OpenWindow(#Mainform, 0, 0, 500, 500, "New Form", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(#Image, 5, 5, 298, 472, ImageID(Image))

ResizeImage(Image, 128, 128)  
SetGadgetState(#Image, ImageID(Image))

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
■ Avec ce nouveau code je fais le même resize mais progressivement et c'est là que j'ai un souci comme vous allez le voir en exécutant ce code.

Code : Tout sélectionner

Enumeration
  #Mainform
  #Image
EndEnumeration

UseJPEGImageDecoder()
image  = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\3D\Data\Textures\ValetCoeur.jpg")
OpenWindow(#Mainform, 0, 0, 500, 500, "New Form", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(#Image, 5, 5, 490, 490, ImageID(Image))

For n=128 To 256
  ResizeImage(Image, 512-n, 512-n)  
  SetGadgetState(#Image, ImageID(Image))
Next

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
Merci d'avance à ceux qui m'apporteront une réponse à ce souci.

Re: ResizeImage successif

Publié : mar. 29/juil./2014 15:14
par Backup
c'est parceque par defaut une interpolation est effectué sur le Resizeimage

utilises

Code : Tout sélectionner

 ResizeImage(Image, 512-n, 512-n,#PB_Image_Raw) 


ça devrai le faire

Re: ResizeImage successif

Publié : mar. 29/juil./2014 15:17
par majikeyric
Au début je croyais que c'était parce-que le ratio de l'image n'était pas conservé pendant le resize, alors j'ai modifié ton code.
Et j'ai rajouté le param #Pb_Image_Raw au resize.

Code : Tout sélectionner

Enumeration
  #Mainform
  #Image
EndEnumeration

UseJPEGImageDecoder()
image  = LoadImage(#PB_Any, #PB_Compiler_Home+"Examples\3D\Data\Textures\ValetCoeur.jpg")
OpenWindow(#Mainform, 0, 0, 500, 500, "New Form", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(#Image, 5, 5, 490, 490, ImageID(Image))

Define.d n

n=1
Repeat
  ResizeImage(image, 298*n, 472*n,#PB_Image_Raw) 
  SetGadgetState(#Image, ImageID(Image))
  n-0.001
Until n<0.4

Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
Le résultat est tout aussi surprenant... Chez moi c'est un clip est pas un resize qui est fait...

Re: ResizeImage successif

Publié : mar. 29/juil./2014 15:18
par Backup
oui , c'est vrai ça clip en fait 8O

Re: ResizeImage successif

Publié : mar. 29/juil./2014 15:24
par Ar-S
anéfé :) ça m'a fait rire.

Tu devrais peut-être dessiner un carré blanc de la taille de ton gadget et le placer entre chaque image de resize

Re: ResizeImage successif

Publié : mar. 29/juil./2014 16:03
par Backup
...

Re: ResizeImage successif

Publié : mar. 29/juil./2014 16:28
par djes
A mon avis, il n'y a pas de bug, c'est simplement que l'image se dégrade réduction après réduction. Il faudrait reprendre l'image originale chaque fois pour palier ce problème.

Mais bon, l'algo de réduction ne semble pas extraordinaire non plus, et c'est encore plus flagrant avec des nombres flottants...

Code d'illustration

Code : Tout sélectionner

Enumeration
  #Mainform
  #Image
EndEnumeration

UseJPEGImageDecoder()
LoadImage(1, #PB_Compiler_Home+"Examples\3D\Data\Textures\ValetCoeur.jpg")
OpenWindow(#Mainform, 0, 0, 500, 500, "New Form", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(#Image, 5, 5, 490, 490, ImageID(1))

Repeat 
  
  Event = WindowEvent()
  
  If Event
  Else
    Delay(100)
    ResizeImage(1, 512-n, 512-n);, #PB_Image_Smooth)  
    SetGadgetState(#Image, ImageID(1))
  EndIf
  n + 1

Until Event = #PB_Event_CloseWindow

Re: ResizeImage successif

Publié : mar. 29/juil./2014 17:07
par Ar-S
@djes c'est pas faux

Re: ResizeImage successif

Publié : mar. 29/juil./2014 18:41
par kernadec
bonjour
méthode que je l'ai utilisée pour faire un mode zoom
il faut conserver l'image originale pour recalculer le zoom et éviter la dégradation.

Cordialement

Code : Tout sélectionner

;####################################################################
;###    image   Zoom  scroll canvas deplacement de l'image        ###
;###      avec la mouse  et gestion zoom de l'alpha               ###
;###            par kernadec  jullet 2011  Ver:  PB 4.60 b3       ###
;####################################################################
Enumeration
  #Window
  #Image0  
  #Image1 
  #Scroll
  #canvas
EndEnumeration
win_w=600 
win_h=600 
image_w.l=800 
image_h.l=800 

ExamineDesktops()
CreateImage(#Image0,image_w+DesktopWidth(0),image_h+DesktopHeight(0))
CreateImage(#Image1,image_w+DesktopWidth(0),image_h+DesktopHeight(0))

LoadImage(#Image0, "c:\purebasic\examples\sources\data\Geebee2.bmp") 

ResizeImage(#Image0,image_w,image_h,#PB_Image_Smooth)       

CopyImage(#Image0,#Image1)               ;  crée une copie de l'image pour eviter la degradation de resize

OpenWindow(#Window,0, 0,win_w,win_h, "Zoom Canvas ScrollArea clic deplace  Kernadec", #WS_SYSMENU | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0),ImageHeight(#Image0),30)
SetWindowColor(#Window,#White) 
CanvasGadget(#canvas, 0, 0,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Canvas_DrawFocus|#PB_Canvas_Keyboard)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)-WindowWidth(#Window))/2)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)-WindowHeight(#Window))/2)
bm=#False
Repeat
  Event= WaitWindowEvent()
  SetActiveGadget(#canvas)             ; focus Canvas : MouseWheel      
  Select EventType()  
    Case #PB_EventType_MouseWheel  
      
      delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*10) ; delta*10
      CopyImage(#Image1,#Image0)      ; restore l'image originale                         
      ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)	
      StartDrawing(CanvasOutput(#canvas))
      Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
      DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),255)
      StopDrawing()
      
    Case #PB_EventType_RightButtonDown ; choix du bouton deplacer
      bm=#True
      PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
      
    Case #PB_EventType_LeftButtonDown  ; choix du bouton deplacer
      bm=#True
      PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1  
      
    Case #PB_EventType_MouseMove       ; deplacement
      If bm=#True
        PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
        PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm
      EndIf
      CopyImage(#Image1,#Image0)      ; Restore l'image originale  
      ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)	
      StartDrawing(CanvasOutput(#canvas))
      Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
      DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),255)
      StopDrawing() 
      
    Case #PB_EventType_LeftButtonUp
      bm=#False  
      
    Case #PB_EventType_RightButtonUp    
      bm=#False
  EndSelect  
  
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window))
      win_w=WindowWidth(#Window)
      win_h=WindowHeight(#Window)
  EndSelect  
  
Until Event= #PB_Event_CloseWindow
End


Re: ResizeImage successif

Publié : mar. 29/juil./2014 18:43
par falsam
Dobro, Ar-s, djes, majikeyric et kernadec merci pour vos toutes ces réponses que je vais m'empresser de tester :)

Re: ResizeImage successif

Publié : lun. 15/juin/2015 11:50
par blendman
Salut

Je me permets de relancer ce sujet, car je pense qu'il y a bien un bug avec le resizeImage() et #PB_Image_Smooth, c'est d'ailleurs confirmé par LSI (qui avait trouvé une méthode pour certaines images, mais qui ne semble pas marcher dans ce cas-ci).

Il suffit de tester ce code, je ne vois pas pourquoi on a une bordure blanche autour du cercle, car un cercle noir (avec un fond noir transparent), réduit, il devrait rester tout noir ^^.

Code : Tout sélectionner

Enumeration 
  
#ImgOriginal  
#ImgCopy 

EndEnumeration

winw = 400
winh = 300

OpenWindow(0, 0, 0, winw,winh, "Resize bug", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

w = 100
h = 100

If CreateImage(#ImgOriginal,w,h,32,#PB_Image_Transparent)
  If StartDrawing(ImageOutput(#ImgOriginal))
    DrawingMode(#PB_2DDrawing_AllChannels)
    Circle(w/2,h/2,w/2 -1,RGBA(0,0,0,255))
    StopDrawing()
  EndIf
EndIf

CopyImage(#ImgOriginal,#ImgCopy)
ResizeImage(#ImgCopy,30,30,#PB_Image_Smooth)

; ok if I uncomment those lines, but I don't want to do this operation each time I use resizeImage, and it works only for single color image..
; If StartDrawing(ImageOutput(#ImgCopy))
;     DrawingMode(#PB_2DDrawing_AlphaClip)
;     Box(0,0,30,30,RGBA(0,0,0,255))
;     StopDrawing()
;   EndIf


If CanvasGadget(0,0,0,winw,winh)
  If StartDrawing(CanvasOutput(0))
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    For i = 0 To 20
      DrawAlphaImage(ImageID(#ImgCopy),50+i*5,50+i*7)
    Next i
    StopDrawing()  
    
  EndIf
EndIf

Repeat
  
  Event = WaitWindowEvent()
    
Until Event = #PB_Event_CloseWindow

Re: ResizeImage successif

Publié : lun. 15/juin/2015 12:33
par Ar-S
En mettant un fond noir sur le canvas je n'ai pas de bordures blanches sur les cercles
Ton canvas est blanc si tu ne lui imposes pas de couleur. Je vois pas le soucis.

Code : Tout sélectionner

If CanvasGadget(0,0,0,winw,winh)
  If StartDrawing(CanvasOutput(0))
    Box(0,0,winw,winh,$0)
    DrawingMode(#PB_2DDrawing_AlphaBlend)
    
    For i = 0 To 20
      
      DrawAlphaImage(ImageID(#ImgCopy),50+i*5,50+i*7)
    Next i
    StopDrawing() 
   
  EndIf
EndIf

Re: ResizeImage successif

Publié : lun. 15/juin/2015 13:03
par blendman
Heu, c'est une blague que tu me fais, là, non :) ?
Déjà, chez moi, même avec ton code, j'ai la bordure blanche entre les cercles ^^.
En plus, ta "technique" est vraiment très limitée tout de même ^^. Si tu veux dessiner sur un fond blanc (logiciel de dessin) ou de n'importe quel couleur, ou si tu dessines sur une texture non uniforme, sur une autre image (non totalement noir) ? Et si tu dessines non pas sur un canvas mais sur une image transparente ? Et si tu dessines avec une autre couleur ?
etc, etc...
Non, sérieux, c'est pas comme ça qu'on corrige un bug, Ar-s :mrgreen:. Tu aurais du dire : "ben t'as qu'à pas dessiner de cercle noir resizés et t'auras pas de bug" lol (oui, je suis taquin, oui).

Re: ResizeImage successif

Publié : lun. 15/juin/2015 18:03
par Ar-S

Code : Tout sélectionner

Déjà, chez moi, même avec ton code, j'ai la bordure blanche entre les cercles ^^.
J'ai dessiné des cercles noires sur un carré noir pour voir s'il y avait un contour autour des cercles. Parce que ton exemple en rendu me donne des cercles noires sur un fond blanc. J'ai donc fait un fond noir puis lancer le dessin de tes cercles. Je n'ai rien corrigé question bug, j'ai voulu le reproduire et n'y suis pas arrivé, c'est différent ;)
J'ai testé sous linux (ceci explique peut être cela ?) et je n'ai pas de contour apparaissant blanc.
Avec un fond bleu ça donne ça
Image

Je ne vois pas de contour blanc. Ou alors j'ai rien pipé à ton soucis ^^

Re: ResizeImage successif

Publié : lun. 15/juin/2015 18:27
par falsam
Blendman essayes ResizeImage(#ImgCopy,30,30,#PB_Image_Raw)
#PB_Image_Raw : Resize the image without any interpolation.