我可以获得第一个像素但是如何获得其他像素?
def get_alpha (x:uint8,y:uint8): uchar
r:uchar
g:uchar
b:uchar
a:uchar
dire:uint32*
r=0
g=0
b=0
a=0
Image.do_lock()
dire=Image.pixels
Image.format.get_rgba (*dire, ref r,ref g,ref b,ref a)
Image.unlock()
print "En x= %d y=%d ,%d %d %d %d",x,y,r,g,b,a
return a
这是获取像素的SDL Wiki的c代码。我只需要(3和4字节)。我看到我可以做surface.pixels + y * surface.pitch * surface.format.BytesPerPixel去位置,但我有问题。第一个位置很好但是全白色表面的最后位置给了我其他颜色。我认为我的措施并不好。
// Nota, código obtenido del wiki de SDL
// http://www.libsdl.org/cgi/docwiki.cgi/Pixel_20Access
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;
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 */
}
}
答案 0 :(得分:1)
我想我知道答案。我已经学习了一些关于指针的东西而没有使用get_rgba方法我尝试直接从内存中获取它们。在我的情况下,我不会得到alpha像素。当变量BytesPerPixel给我1,2或3时,我认为没有可用的alpha通道。当BytesPerPixel给我4时,我取第四个字节来获取alpha通道值。当像素大小为4时,结构为RGBA(红色,绿色,蓝色,Alpha)。
def get_alpha (x:uint8,y:uint8): uchar
dire:uint8*
var alpha=0
Control.Imagen_0.do_lock()
dire=Control.Imagen_0.pixels // this is the first point of Image
dire+= (y*Control.Imagen_0.pitch)+ (x*Control.Imagen_0.format.BytesPerPixel) // this calculates the point x,y in memory
Control.Imagen_0.unlock()
case Control.Imagen_0.format.BytesPerPixel
when 1,2,3
alpha=255
when 4
dire+=+3 // go to alpha channel byte
alpha=*dire // take from memory point
return alpha