image sprite

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

image sprite

Message par graph100 »

pourquoi on ne peut pas convertir rapidement un sprite en image et vice versa ??

es il possible de creer une image a partir d'une zone memoire dont on a la taille et le pointeur ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: image sprite

Message par Backup »

graph100 a écrit :pourquoi on ne peut pas convertir rapidement un sprite en image et vice versa ??

si ! on peut ! :D

mais pour ça il faut utiliser les point() et plot()
si tu veux faire du rapide, tu met ton sprite dans un tableau
comme ça tu evite l'utilisation repeté de la fonction point()
qui est tres tres lente en purebasic !

es il possible de creer une image a partir d'une zone memoire dont on a la taille et le pointeur ?
je pense que oui, en pokant (poke()) dans l'image
ou bien en utilisant un plot() a chaque valeur peek(é)


sinon Drac avait fait ça (je viens de te le mettre en purebasic 4.02)


  ; Code de Drac
; mis en purebasic 4.02 par Dobro
; n'oubliez pas d'indiquer une image jpg valide pour le sprite
; en ligne 16 !!

Declare CopySpriteToImage(Sprite, ImageID )
UseJPEGImageDecoder ()
#image =0
#sprite =0
;Example:
InitSprite ()

OpenScreen (1024,768,32, "TEST" )
CreateImage ( #image , 800, 800)
; on charge un sprite
LoadSprite ( #sprite , "D:\Mes_Photos\Capture_ecran\horloge.jpg" , #PB_Sprite_Memory )
;CallDebugger
CopySpriteToImage( #sprite , #image )
; apres transformation en image , on affiche l'image !!
StartDrawing ( ScreenOutput ())
DrawImage ( ImageID ( #image ),0,0,800,600)
StopDrawing ()

FlipBuffers ()
Delay (2000)


Procedure CopySpriteToImage(Sprite, ImageID )
    hdc= StartDrawing ( SpriteOutput (Sprite))
    bmp.BITMAP\bmWidth= SpriteWidth (Sprite)
    bmp\bmHeight= SpriteHeight (Sprite)
    bmp\bmPlanes=1
    bmp\bmBitsPixel= GetDeviceCaps_ (hdc, #BITSPIXEL )
    bmp\bmBits= DrawingBuffer ()
    bmp\bmWidthBytes= DrawingBufferPitch ()
    hBmp= CreateBitmapIndirect_ (bmp)
     StopDrawing ()
     ;UseImage(ImageID)
     StartDrawing ( ImageOutput ( ImageID ))
     DrawImage (hBmp,0,0)
     StopDrawing ()
     DeleteObject_ (hBmp)
EndProcedure


j'ai utilisé cette image :D

Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

>> est il possible de creer une image a partir d'une zone memoire dont on a la taille et le pointeur ?

CatchImage() et CatchSprite() ? sont fait pour çà.
Image
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

merci ^^
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

ah avec le code de Dobro j'arrive a passer l'image a une dll
mais je n'arrive pas a faire le retour dll -> prog !

catchimage() ne marche pas quand l'image est chargée, existe en memoire.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: image sprite

Message par graph100 »

Dobro a écrit :si ! on peut ! :D

mais pour ça il faut utiliser les point() et plot()
si tu veux faire du rapide, tu met ton sprite dans un tableau
comme ça tu evite l'utilisation repeté de la fonction point()
qui est tres tres lente en purebasic !
pour mettre le sprite dans un tableau ?
pour une image il y a la librairie effect mais pour 3.94
lol
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Si ton fichier dll te retourne le handle de l'image, voila une fonction pour créer une image PB à partir de l'ID
(compatible bitmap, icon & cursor)

Code : Tout sélectionner

Procedure.l HackImage(Image.l, ImageID.l)
  Protected *ImageID.Long, Index.l
  Protected ic.IconInfo, bm.Bitmap
  
  If ImageID And Not GetIconInfo_(ImageID, ic)
    ic\hbmColor = ImageID
  EndIf
    
  If GetObject_(ic\hbmColor, SizeOf(Bitmap), bm)
    Index = CreateImage(Image, bm\bmWidth, bm\bmHeight, bm\bmBitsPixel)
    If Image <> #PB_Any : Index = Image : EndIf
    
    *ImageID = IsImage(Index)
  EndIf
  
  If *ImageID
    
    DeleteObject_(*ImageID\l)
    *ImageID\l = ImageID
    If Image = #PB_Any
      ImageID = Index
    EndIf
    
  Else
    
    If GetIconInfo_(ImageID, ic)
      If ic\fIcon
        DestroyIcon_(ImageID)
      Else
        DestroyCursor_(ImageID)
      EndIf
    Else
      DeleteObject_(ImageID)
    EndIf
    ImageID = #Null
    
  EndIf
  
  ProcedureReturn ImageID
EndProcedure

#Mon_Image = 1

IconID = LoadIcon_(#Null, #IDI_APPLICATION)

HackImage(#Mon_Image, IconID)

If OpenWindow(0, 0, 0, 245, 105, "ImageGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CreateGadgetList(WindowID(0))
  ImageGadget(0,  10, 10, 100, 83, ImageID(#Mon_Image))
  ImageGadget(1, 130, 10, 100, 83, ImageID(#Mon_Image), #PB_Image_Border)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Dri
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Message par graph100 »

ok je vais voir ca !!
merci
Répondre