8
votes

Comment puis-je modifier les pixels à l'aide de SDL?

J'ai un léger problème: je ne peux pas modifier les pixels d'un écran SDL.

Plus précisément, le code suivant ne fonctionne pas. P>

Uint32 * pixels = (Uint32 *) screen -> pixels; 
screen -> pixels = pixels;


3 commentaires

Je ne change pas de pixel particulier ici. Je sais simplement tout ce qui est de la copie et d'essayer de tout copier. Et par format, que voulez-vous dire?


bien sûr. je suis juste en train de jouer, apprendre à connaître la syntaxe et les trucs


Cela fonctionne comme il se doit - ne fait rien.


5 Réponses :


-2
votes

Vous ne devez pas modifier le contenu de la structure SDL_SURFACE. Si vous souhaitez copier les pixels, vous devez malloc () de mémoire, puis memcpy () les pixels.


5 commentaires

mais mon objectif est de jouer avec les pixels


Pouvez-vous clarifier pourquoi nous ne doit pas modifier le contenu de la SDL_SURFACE? Est-ce que cela pourrait conduire à des bugs / comportement inattendu?


@snapfractalpop: à partir du sdl_video.h Fichier: "Cette structure [sdl_surface] doit être traitée comme en lecture seule, à l'exception des" pixels "[...]". Si vous ne vous conformez pas, vous enfreignez l'invariant de la structure et que la bibliothèque ne fonctionnera donc pas correctement.


Merci pour l'info. Je n'étais que concerné par la lecture / l'écriture sur les données de pixels (qui apparaît bien si nous utilisons sdl_lockSurface ).


-1, vous pouvez définitivement modifier pixels une partie de la structure SDL_SURFACE.



22
votes

J'ai eu les fonctions suivantes mentant pour définir des pixels dans une SDL_SURFACE. Il existe deux versions chacune des surfaces 32 bits, 24 bits, 16 bits et 8 bits. Si vous souhaitez simplement définir un seul pixel, vous utiliseriez les versions normales. Mais si vous souhaitez définir une bande de pixels, vous verrouillez d'abord la surface, puis vous utilisez la version NOLOCK (nommée de sorte que cela ne verrouille pas la surface), puis vous déverrouillez. De cette façon, vous ne verrouillez-vous pas à plusieurs reprises et déverrouillez la surface, ce qui est censé être une opération coûteuse, même si je ne pense pas que je l'ai jamais testé. XXX


1 commentaires

Je sais que c'est une ancienne question / réponse, mais je voudrais souligner que le programme s'écrasera si vous essayez de saisir un pixel qui est en dehors des limites de la surface. Par exemple, essayer d'obtenir un pixel à une coordonnée x de 64 à partir d'une surface de 64 largeur se plantera car le dernier pixel est à 63 ans.



2
votes

manipuler le contenu de Screen-> pixels modifiera des pixels, avec quelques mises en garde.

Tout d'abord, comme vous l'avez montré dans le code de code, notez que Screen-> pixels est un pointeur sur les données de pixel de la surface. Les données de pixels lui-même sont accessibles comme une matrice linéaire à partir de ce pointeur sur la base de la largeur de la surface ( surface de surface> ) et la taille du pixel en octets. La taille de pixels (AKA Profondeur) est définie lors de l'initialisation, en utilisant sdl_setvideomode () et peut être trouvé dans écran-> format-> bytesperpixel . .

Le verrouillage de la surface avant de modifier peut être nécessaire.

En outre, en fonction des options transmises à sdl_setvideomode () Vous devez également appeler sdl_flip () pour afficher les modifications que vous avez apportées.

Un exemple de travail de manipulation de pixels peut être trouvé ici .


Comme indiqué dans les commentaires, le code indiqué dans la question ne va pas réellement faire quelque chose visible car aucune modification n'est apportée aux données de pixels.


0 commentaires

1
votes

Ajout d'une variante SDL2 manipulant des pixels de manipulation non sur une surface mais dans un rendu (et qui ne se bloque pas si vous essayez de manipuler des pixels en dehors de votre écran, contrairement aux réponses précédentes)

void putPixelRGB(SDL_Renderer* renderer, int x, int y, unsigned char r, unsigned char g, unsigned char b)
{
    SDL_SetRenderDrawColor(renderer, (Uint8)r, (Uint8)g, (Uint8)b, 255);
    SDL_RenderDrawPoint(renderer, x, y);
}


0 commentaires

-2
votes

Pourquoi changer un pixel?

Faire une nouvelle surface et un rect p>

// code -----------> P>

SDL_Surface *screen, *PIXEL = NULL;

SDL_Rect PIXELRect;
PIXELRect.h=5;
PIXELRect.w=5;
PIXELRect.x=100;
PIXELRect.y=100;

screen = SDL_SetVideoMode(640, 468, 32, SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_ANYFORMAT);

while(running){
SDL_FillRect(screen, &PIXELRect, (#color));
}


0 commentaires