语法不清楚指针和矩阵

时间:2014-01-06 12:56:12

标签: c pointers matrix libpng

我在C编码,我必须使用png图像,所以我使用libpng库。在我的项目中,我使用这种结构:

png_bytep *row_pointers; /* <-- to declare the pointer that will contain the image 
                           and this to initialize the pointer to contain the image. */

row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height); 
for(int y = 0; y < height; y++) {
    row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png,info)); 
}

我的问题是:在这段代码之后,我的图像被复制到row_pointers中,我想将它复制到png_byte map[x][y]中,这样我就可以轻松地像素化像素。 有人可以帮帮我吗? 感谢

2 个答案:

答案 0 :(得分:0)

确定。那是指向指针的指针!

png_bytep =指向png_byte

的指针

如果您取消png_bytep并使用png_byte,您的代码将如下所示。

int height = 10;
int width = 20;

png_byte **row_pointers;
row_pointers = (png_byte**)malloc(sizeof(png_byte*) * height);  <-- This is basically your number of rows.. ie height of your matrix.
for(int y = 0; y < height; y++) 
{
    row_pointers[y] = (png_byte*)malloc(sizeof(png_byte)*width); <-- This is representing number of elements in each row.. so width. 

}

假设您的结构有两个整数x和y。你必须提交以下数据..

for(int i=0;i< height;i++)
{
    for (int j=0;j<width;j++)
    {
        row_pointers[i][j].x = i*j;
        row_pointers[i][j].y = i*j;
    }
}

假设您的地图也有类似的结构。这就是你复制数据的方式..

for(int i=0;i< height;i++)
{
    for (int j=0;j<width;j++)
    {
        map[i][j].x = row_pointers[i][j].x;
        map[i][j].y = row_pointers[i][j].y;
    }
}

答案 1 :(得分:0)

在libpng的contrib / pngminus目录中查看pnm2png.c。

在此代码中,“png_pixels”是一个包含所有像素的简单数组,而row_pointers是指向png_pixels中每行开头的指针数组:

/* row_bytes is the width x number of channels x (bit-depth / 8) */
  row_bytes = width * channels * ((bit_depth <= 8) ? 1 : 2);

  png_pixels = (png_byte *) malloc (row_bytes * height * sizeof (png_byte))

/* set the individual row_pointers to point at the correct offsets */
  for (i = 0; i < (height); i++)
    row_pointers[i] = png_pixels + i * row_bytes;

/* now we can go ahead and just read the whole image */
  png_read_image (png_ptr, row_pointers);

png_read_image完成后,您可以轻松处理png_pixels数组中的像素。

请注意,只有一个“malloc”,它分配png_pixels。此代码不是为每一行单独执行“malloc”,而是计算row_pointers的值。