使用Vala / Genie获取SDL Surface的像素颜色

时间:2012-09-06 22:42:03

标签: vala genie

我可以获得第一个像素但是如何获得其他像素?

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 */
    }
} 

1 个答案:

答案 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