user2711681
user2711681

Reputation: 275

Pixel manipulation using sdl

I am trying to manipulate pixel using sdl and manage to read them up now. Below is my sample code. When I print I this printf("\npixelvalue is is : %d",MyPixel); I get values like this

11275780
11275776 
etc 

I know these are not in hex form but how to manipulate say I want to filter just the blue colors out? Secondly after manipulation how to generate the new image?

#include "SDL.h"

int main( int argc, char* argv[] )
{
  SDL_Surface *screen, *image;
  SDL_Event event;
  Uint8 *keys;
  int done = 0;

  if (SDL_Init(SDL_INIT_VIDEO) == -1)
  {
    printf("Can't init SDL: %s\n", SDL_GetError());
    exit(1);
  }
  atexit(SDL_Quit);
  SDL_WM_SetCaption("sample1", "app.ico");

  /* obtain the SDL surfance of the video card */
  screen = SDL_SetVideoMode(640, 480, 24, SDL_HWSURFACE);
  if (screen == NULL)
  {
    printf("Can't set video mode: %s\n", SDL_GetError());
    exit(1);
  }
  printf("Loading here");

  /* load BMP file */
  image = SDL_LoadBMP("testa.bmp");
  Uint32* pixels = (Uint32*)image->pixels;
  int width = image->w;
  int height = image->h;
  printf("Widts is : %d",image->w);

  for(int iH = 1; iH<=height; iH++)
    for(int iW = 1; iW<=width; iW++)
    {
      printf("\nIh is : %d",iH);
      printf("\nIw is : %d",iW);
      Uint32* MyPixel = pixels + ( (iH-1) + image->w ) + iW;
      printf("\npixelvalue is  is : %d",MyPixel);
    }

  if (image == NULL) {
    printf("Can't load image of tux: %s\n", SDL_GetError());
    exit(1);
  }

  /* Blit image to the video surface */
  SDL_BlitSurface(image, NULL, screen, NULL);   
  SDL_UpdateRect(screen, 0, 0, screen->w, screen->h);

  /* free the image if it is no longer needed */
  SDL_FreeSurface(image);

  /* process the keyboard event */
  while (!done)
  {
    // Poll input queue, run keyboard loop
    while ( SDL_PollEvent(&event) )
    {
      if ( event.type == SDL_QUIT ) 
      {
        done = 1;
        break;
      }
    }
    keys = SDL_GetKeyState(NULL);
    if (keys[SDLK_q])
    {
      done = 1;
    }
    // Release CPU for others
    SDL_Delay(100);
  }
  // Release memeory and Quit SDL
  SDL_FreeSurface(screen);
  SDL_Quit();
  return 0;    
}

Upvotes: 1

Views: 2714

Answers (3)

this
this

Reputation: 5290

You are printing the value of the pointer MyPixel. To get the value you have to dereference the pointer to the pixel value like this: *MyPixel

Then the printf would look like this:

printf("\npixelvalue is : %d and the address of that pixel is: %p\n",*MyPixel , MyPixel);

Other errors:

  1. Your for loops are incorrect. You should loop from 0 to less than width or height, or else you will read uninitialized memory.

  2. You didn't lock the surface. Although you are only reading the pixels and nothing should go wrong it is still not correct.

  3. Test for correctness if the image pointer comes after you are already using the pointer. Put the test right after the initialization.

Upvotes: 1

pampeho
pampeho

Reputation: 704

Use SDL_MapRGB and SDL_MapRGBA to sort colors out. SDL will filter it out for you, based on surface format.

Just like this:

Uint32 rawpixel = getpixel(surface, x, y);
Uint8 red, green, blue;

SDL_GetRGB(rawpixel, surface->format, &red, &green, &blue);

Upvotes: 2

Bartlomiej Lewandowski
Bartlomiej Lewandowski

Reputation: 11180

If I recall correctly I used sdl_gfx for pixel manipulation.

It also contains function like drawing a circle, oval etc.

Upvotes: 0

Related Questions