CopySpriteToImage()

Sujets variés concernant le développement en PureBasic
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

CopySpriteToImage()

Message 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) 
fweil
Messages : 505
Inscription : dim. 16/mai/2004 17:50
Localisation : Bayonne (64)
Contact :

Message 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 ?
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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 ;)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
barnierchristophe
Messages : 64
Inscription : lun. 07/févr./2005 11:18

Sauvegarde d'ecran

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Répondre