我在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]
中,这样我就可以轻松地像素化像素。
有人可以帮帮我吗?
感谢
答案 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的值。