Page 1 of 1

Création de Surfaces SDL 8-bits

Unread postPosted: 06 Jan 2013, 16:08
by Lepzulnag
Bonjour :) ,

j'ai un problème lors de la sauvegarde d'image à l'aide de la SDL sur les calculettes en niveaux de gris : l'image n'est pas enregistrée et est entièrement noire. :(

Pour enregistrer une image à l'aide de la SDL j'utilise ce code :

Code: Select all
saveImage = SDL_CreateRGBSurface(SDL_SWSURFACE, area.w, area.h, is_cx? 16:8, 0, 0, 0, 0);
SDL_BlitSurface(scr, &area, saveImage, NULL);


Je créé ma surface puis je la remplis avec mon image, c'est cela l'idée.
Sur CX cela marche bien(les pixels sont enregistrés en 16 bits), mais pas sur les non-CX où il n'y a que 8 bits par pixel.

Je suis allé voir la documentation de la SDL sur la fonction SDL_CreateRGBSurface : http://sdl.beuc.net/sdl.wiki/SDL_CreateRGBSurface mais je n'ai malheureusement pas tout compris.

If bitsPerPixel is 8 an empty palette is allocated for the surface, otherwise a 'packed-pixel' SDL_PixelFormat is created using the [RGBA]mask's provided


Cette phrase en particulier. Je ne la comprends vraiment pas et j'ai l'impression qu'elle est la solution à mon problème. Si quelqu'un qui a de l'expérience dans la gestion d'image saurait m'expliquer, cela m'aiderait beaucoup :)

Re: Création de Surfaces SDL 8-bits

Unread postPosted: 06 Jan 2013, 17:50
by Levak
Humm, ça me fait penser à un problème que j'ai déjà eu avec un portage de SDL en OCAML :
http://webcache.googleusercontent.com/s ... ent=ubuntu

Levak wrote:Bon, je rectifie définitivement le problème.

Le vrai problème n'est pas put_pixel[_color] ni même get_pixel[_color], car isolément ils fonctionnent sur une surface venant d'un Sdlloader.load_image.

Il semblerait que le problème vienne de ça :
Code :
let dst = Sdlvideo.create_RGB_surface_format src [] x y in

En effet, le src est l'image en niveau de gris a une profondeur de 256 contre 1546. Là create_RGB_surface_format va récupérer directement le format de pixel depuis src (d'ailleurs je ne sais pas ce qu'il récupère pour pouvoir jongler sans). Et là les manipulations en get_pixel[_color] et put_pixel[_color] ne fonctionnent plus. en fait aucune opération sur les pixels ne fonctionne, lorsque l'image est en niveaux de gris.
Alors que si la surface provient de Sdlloader.load_image tout fonctionne.

Ptet qu'un blit_surface fonctionnerait mieux ...

Re: Création de Surfaces SDL 8-bits

Unread postPosted: 06 Jan 2013, 18:21
by Lepzulnag
Oui en effet, le problème semble être le même !
Lorsque l'on créé une image en niveaux de gris avec SdlVideo.create_RGB_surface_format ou son équivalent SDL_CreateRGBSurface, aucune opération ne marche sur cette surface ainsi créée.

Re: Création de Surfaces SDL 8-bits

Unread postPosted: 16 Jan 2013, 19:22
by sarniq
If bitsPerPixel is 8 an empty palette is allocated for the surface

Et donc tu dois definir le palette toi-meme a l'aide de SDL_SetColors().
Regarde la doc.
Un simple SDL_SetColors(surface, screen->format->palette->colors, 0, screen->format->palette->ncolors) devrait suffire.