0

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

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

1 回答 1

1

我想我知道答案。我已经学习了一些关于指针的知识,并且没有使用 get_rgba 方法,我尝试直接从内存中获取它们。就我而言,我不会获得 alpha 像素。当变量 BytesPerPixel 给我 1、2 或 3 时,我认为没有可能的 alpha 通道。当 BytesPerPixel 给我 4 时,我将第四个字节用于获取 alpha 通道值。当像素大小为 4 时,结构为 RGBA(红、绿、蓝、阿尔法)。

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 
于 2012-09-07T18:42:07.300 回答