【问题标题】:Syntax not clear about pointers and matrix语法不清楚指针和矩阵
【发布时间】:2014-01-06 12:56:11
【问题描述】:

我正在用 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] 中,这样我就可以轻松地逐个像素地工作。 有人可以帮助我吗? 谢谢

【问题讨论】:

  • 你确定row_pointers 不是双指针吗?
  • 不,我不是。我已经复制了这部分代码,这就是我配音的原因。 PS:如果它是双指针,我怎么能把它复制到另一个更简单的结构来管理?
  • @hacks png_bytep 最后的p 表示它是一个字节指针。所以是正确的。他必须在每个 malloc 中删除他的演员表。在 C 中不需要它。
  • 删除每个演员应该是这样的:row_pointers = malloc(sizeof(png_bytep) * height); for(int y = 0; y

标签: c pointers matrix libpng


【解决方案1】:

好的。那就是指向指针的指针!

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;
    }
}

【讨论】:

  • 这段代码什么也没做。它与原始代码相同。只有名称 typedef 已被其原始类型替换...
  • 他的(隐藏的)问题是:我如何让row_pointers/map 包含我的图像像素?
  • 清除,但是在我如何将row_pointers分配给map[x][y]之后以这种方式修改我的代码(因为最后一点是能够使用map [x]显示每个像素[ y](或类似的东西)
  • Err.. 他的主要主题行问题是语法不清楚。所以我试图解释它是怎么回事..
  • 是的。我会立即尝试使用此代码。假设只有一个int变量x,在初始化之后,我可以用printf("map[i][j]=%d",map[i][j].x)正确打印地图吗?
【解决方案2】:

查看 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 的值。

【讨论】:

  • 这似乎是一个很好的提示,谢谢。我也会尝试使用它。但是在频道中我已经有了那个数量或者我必须设置那个变量?
  • 通道可以是 1、2、3 或 4,具体取决于 PNG 颜色类型。您可以使用“png_get_channels(png, png_info);”获取通道数。此外,如果您可能正在阅读 16 位样本,则需要考虑到这一点。请参阅我之前提到的 libpng/contrib/pngminus 示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多