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 メソッドを使用せずにメモリから直接取得しようとしました。私の場合、アルファピクセルを取得することはありません。変数 BytesPerPixel が私に 1、2、または 3 を与えるとき、可能なアルファチャンネルがないと思います。BytesPerPixel が 4 を返すと、アルファ チャネル値を取得するために 4 番目のバイトを取得します。ピクセル サイズが 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 に答える