Page 1 sur 1

CopySpriteToImage()

Publié : mar. 20/sept./2005 15:52
par Dräc
J’ai légèrement adapté un code issu du forum anglais Copy a 2D Sprite to an Image?
pour copier le contenu d’un sprite existant vers une image existante.

C’est perfectible, mais mes connaissances dans les API et ma compréhension des conflits entre sprite et image me limitent.
Si quelqu’un peu faire part de ses connaissances en la matière, ca m’interresse ;)

Code : Tout sélectionner

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()) 
  DrawImage(hBmp,0,0) 
  StopDrawing()
  DeleteObject_(hBmp) 
EndProcedure 

;Example: 
InitSprite() 

OpenScreen(800,600,16,"TEST") 

CreateImage(0, 400, 400)
LoadSprite(1,"C:\Program Files\PureBasic\Examples\Sources\Data\Background.bmp",#PB_Sprite_Memory)  

CopySpriteToImage(1, 0) 

StartDrawing(ScreenOutput()) 
DrawImage(UseImage(0),0,0,800,600) 
StopDrawing() 

FlipBuffers() 
Delay(2000) 

Publié : mar. 20/sept./2005 17:29
par fweil
Pour un sprite, il n'est pas nécessaire de passer par l'API. On peut utiliser la copie directe de méoire à mémoire avec DrawingBuffer() et DrawingBufferPith() non ?

Publié : ven. 23/sept./2005 12:47
par Dräc
En fait, je ne sais pas trop…
Sprite et Image sont intuitivement des objets proches
Mais pour passer d’un sprite à une image, je pense qu’il faut pouvoir traduire le sprite, qui sa une résolution propre (nombre de couleur), en un élément affichable sur l’écran courant qui lui aussi a sa propre résolution.
Bref, j’ai peu de notion dans ce domaine, alors si quelqu’un connaît un bon moins de se former sur ces notions, merci de se manifester ;)

Publié : ven. 23/sept./2005 22:14
par Backup
l'autre solution toute bete mais bon ! :D

est de sauver le sprite en bmp et de la recharger dans une image !
avec la vitesse des disk dur, ça doit pouvoir etre assez rapide non ? :)


REEDIT

soit dit en passant la methode indique ci-dessus (le code) marche bien ! :D Merci

Sauvegarde d'ecran

Publié : mar. 11/oct./2005 0:15
par barnierchristophe
J'ai détourné ta procedure pour faire une sauvegarde d'écran, çà marche impec. Il y a peut être une solution plus élégante... :P

Procedure TransfertEcranImage(NumImage.l,LargeurEcran.l,HauteurEcran.l)
Protected ImageID.l
Protected resultat.l
resultat=0
If IsImage(NumImage):FreeImage(NumImage):EndIf
If CreateImage(NumImage,LargeurEcran,HauteurEcran)
ImageID=UseImage(NumImage)
If ImageID

Hdc=StartDrawing(ScreenOutput())
If Hdc
bmp.BITMAP\bmWidth=LargeurEcran
bmp\bmHeight=HauteurEcran
bmp\bmPlanes=1
bmp\bmBitsPixel=GetDeviceCaps_(Hdc,#BITSPIXEL)
bmp\bmBits=DrawingBuffer()
bmp\bmWidthBytes=DrawingBufferPitch()
hBmp=CreateBitmapIndirect_(bmp)
StopDrawing()
UseImage(NumImage)
StartDrawing(ImageOutput())
DrawImage(hBmp,0,0)
StopDrawing()
DeleteObject_(hBmp)
resultat=ImageID
EndIf
EndIf
EndIf
ProcedureReturn resultat

EndProcedure

Publié : mar. 11/oct./2005 0:30
par Backup
le soldat inconu avait fait ça !

l'ecran est sauve dans le fichier "Copie d'ecran.bmp"

Code : Tout sélectionner

 ; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :
; Faire une copie d'écran

#CAPTUREBLT = $40000000

Procedure SetWinTransparency(WinHandle.l, Transparency_Level.l)
  If OpenLibrary(0, "user32.dll")
    CallFunction(0, "SetLayeredWindowAttributes", WinHandle, 0, Transparency_Level, 2)
    CloseLibrary(0)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 300, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Plein écran")
  SetWindowLong_(WindowID(), #GWL_EXSTYLE, GetWindowLong_(WindowID(), #GWL_EXSTYLE) | $00080000) ; #WS_EX_LAYERED = $00080000
  SetWinTransparency (WindowID(), 180)
  ; Pour changer le niveau de transparence de la fenêtre
  ; Le niveau de transparence doit être compris entre 1 (transparence totale) et 255 (opaque)
 
  Repeat
    Event = WaitWindowEvent()
  Until Event = #WM_CLOSE
 
EndIf

Ecran_Largeur = GetSystemMetrics_(#SM_CXSCREEN)
Ecran_Hauteur = GetSystemMetrics_(#SM_CYSCREEN)

DC = GetDC_(0)
CreateImage(0, Ecran_Largeur, Ecran_Hauteur)
dessin = StartDrawing(ImageOutput())
BitBlt_(dessin, 0, 0, Ecran_Largeur, Ecran_Hauteur, DC, 0, 0, #SRCPAINT|#CAPTUREBLT)
; pour n'avoir que le fond sans les fenetre retirer le  #CAPTUREBLT
StopDrawing()
ReleaseDC_(0, DC)

SaveImage(0, "Copie d'écran.bmp")

Delay(2000)

Publié : mar. 11/oct./2005 9:34
par Dr. Dri
Dobro a écrit :l'autre solution toute bete mais bon ! :D

est de sauver le sprite en bmp et de la recharger dans une image !
avec la vitesse des disk dur, ça doit pouvoir etre assez rapide non ? :)
imagine que l'utilisateur n'ai des droits d'acces qu'en lecture :?

Dri

Publié : mar. 11/oct./2005 9:47
par Backup
imagine que l'utilisateur n'ai des droits d'acces qu'en lecture Confused

:lol: :lol: pour ecrire un sprite , le gars ne devrais pas etre au travail !!
mais chez lui !! car je supose que s'il n'as pas tout les droit sur son propre ordinateur, c'est qu'il est grave le mec ! :lol: :lol:

sinon il est sur l'ordi du boulot !!

donc 2 choix simple

1- le gars bosse sur un ordi en reseau d'entreprise , il n'as pas de droit d'ecriture , il en fait la demande a son SYSOP

2- le gars bosse sur un ordi en reseau d'entreprise ,
sans que l'entreprise ne soit au courrant !
il ne peut donc obtenir sa permission, donc il retourne a son travail legal au lieu de s'amuser avec le PureBasic a charger et sauver des sprites !!


:lol: :lol: :lol:

Publié : mar. 11/oct./2005 9:54
par Dr. Dri
bah par exemple mon cousin n'a pas tous les droit sur lo'rdi qui est chez lui... c'est un gamin mais n'empeche qu'il lui manque pas mal de droits lol

Dri

PS. la solution c'est le FAT32 :P