[SDL] Reading a bunch of pixels's alpha from a PNG file using SDL_Image? (OpenGL+SDL & Linux)
DARKGuy .
dark.guy.2008 at gmail.com
Tue May 1 23:19:18 PDT 2007
Hey!
Could somebody assist me with making a code that can read a 10x10 (or any
other dimension) region and determine the alpha of each pixel? I'm trying to
use this code but I always seem to get wrong data >.<! according to the main
code, I should get something like this:
(Swap the 1's by 255. I just did it here with 1's to make it clearer)
0 0 0 0 1 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1
But instead I get weird stuff like this:
128 170 255 128 170 255 128 170 255
128 170 255 128 170 255 128 170 255
128 170 255 128 170 255 128 170 255
128 170 255 128 170 255 128 170 255
128 170 255 128 170 255 128 170 255
128 170 255 128 170 255 128 170 255
Which, even if they're alpha values, they aren't the right ones in the
positions I'm requesting. Any help would be GREATLY appreciated!
- DARKGuy
P.D.: Code goes below.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
int main()
{
...
Terrain.Load("terrain.png");
Uint32 pixel;
int px,py;
Uint8 red,green,blue,alpha2;
SDL_LockSurface(Terrain.pix[0]);
for(py = 200; py <= 210; py++){
for(px = 200; px <= 230; px++){
pixel = getpixel(Terrain.pix[0], px, py);
SDL_GetRGBA(pixel, Terrain.pix[0]->format,
&red,&green,&blue,&alpha2);
printf("%u ",alpha2);
}
printf("\n");
}
SDL_UnlockSurface(Terrain.pix[0]);
exit(0);
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FUNCTIONS
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Uint32 getpixel(SDL_Surface *surface, int x, int y)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to retrieve */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp / 8;
switch(bpp) {
case 1:
return *p;
case 2:
return *(Uint16 *)p;
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
case 4:
return *(Uint32 *)p;
default:
return 0; /* shouldn't happen, but avoids warnings */
}
}
Terrain.pix[0] is generated from this:
void Texture::Load(const char filename[]){
GLuint texture;
SDL_Surface * image2 = IMG_Load(filename);
SDL_Surface * imgFile = SDL_DisplayFormatAlpha(image2);
width = (GLfloat)image2->w;
height = (GLfloat)image2->h;
imgF = image2; // here. Look below for further info
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
if(imgFile->format->BitsPerPixel == 32 ||
imgFile->format->BitsPerPixel == 24){
glTexImage2D(GL_TEXTURE_2D, 0, 4, imgFile->w, imgFile->h, 0,
GL_BGRA, GL_UNSIGNED_BYTE, imgFile->pixels);
} else { glTexImage2D(GL_TEXTURE_2D, 0, 4, imgFile->w, imgFile->h,
0, GL_RGBA, GL_UNSIGNED_BYTE, imgFile->pixels); }
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
imgF is this:
class Texture {
public:
GLuint id;
GLfloat width, height;
SDL_Surface * imgF;
void Load(const char filename[]);
};
and pix[0] is this:
class Sprite {
public:
...
vector <SDL_Surface*> pix;
};
When I create a sprite, I do this:
int Sprite::Load(const char texfilename[]) {
Texture tex;
tex.Load(texfilename);
img.push_back(tex.id);
width.push_back(tex.width);
height.push_back(tex.height);
alpha.push_back(1.0f);
pix.push_back(tex.imgF);
animImg=0;
animCounter=0;
angle=0;
Mirror=false;
Flip=false;
return img.size()-1;
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20070502/9312c632/attachment.htm
More information about the SDL
mailing list