0

画像の RGB ピクセルを R、G、B の 2D 配列に個別にマッピングしようとしています。イメージが読み取られると、ピクセルは {r1,g1,b1,r2,g2,b2...} の形式で 1D 配列に格納されます。配列の長さは です3*height*width。2D 配列は、幅 X 高さの寸法になります。

for(i = 0; i < length; i++) { // length = 3*height*width
    image[i][2] = getc(f); // blue pixel
    image[i][1] = getc(f); // green pixel
    image[i][0] = getc(f); // red pixel

    img[count] = (unsigned char)image[i][0];
    count += 1;

    img[count] = (unsigned char)image[i][1];
    count += 1;

    img[count] = (unsigned char)image[i][2];
    count += 1;

    printf("pixel %d : [%d,%d,%d]\n", i+1, image[i][0], image[i][1], image[i][2]);
}

RGB 値は にありimg[]ます。2 次元配列は赤 [][]、緑 [][]、青 [][] です。

助けてください!

4

1 に答える 1

2

私が理解しているように、あなたはカラーフィールドを再構築しようとしています。関数を逆にするだけです:

unsigned char * imgptr = img;

for( int y = 0; y < height; y++ ) {
    for( int x = 0; x < width; x++ ) {
        red[y][x] = *imgptr++;
        green[y][x] = *imgptr++;
        blue[y][x] = *imgptr++;
    }
}

配列を動的に作成するには:

unsigned char** CreateColourPlane( int width, int height )
{
    int i;
    unsigned char ** rows;

    const size_t indexSize = height * sizeof(unsigned char*);
    const size_t dataSize = width * height * sizeof(unsigned char);

    // Allocate memory for row index and data segment.  Note, if using C compiler
    // do not cast the return value from malloc.
    rows = (unsigned char**) malloc( indexSize + dataSize );
    if( rows == NULL ) return NULL;

    // Index rows.  Data segment begins after row index array.
    rows[0] = (unsigned char*)rows + height;
    for( i = 1; i < height; i++ ) {
        rows[i] = rows[i-1] + width;
    }

    return rows;
}

それで:

unsigned char ** red = CreateColourPlane( width, height );
unsigned char ** green = CreateColourPlane( width, height );
unsigned char ** blue = CreateColourPlane( width, height );

それらは簡単に解放できますが、アロケーター関数をラップした場合は常に無料関数をラップすることをお勧めします。

void DeleteColourPlane( unsigned char** p )
{
    free(p);
}
于 2013-01-23T21:47:01.497 に答える