libpng手册中pixel size的含义及计算方式是什么?
关于libpng中"pixel size"的含义与计算方式
来自libpng官方文档:
如果您提前知晓图像尺寸和pixel size,可以在调用
png_read_png()前通过以下代码分配row_pointers:row_pointers = png_malloc(png_ptr, height*sizeof(png_bytep)); for (int i=0; i<height, i++) row_pointers[i]=png_malloc(png_ptr, width*pixel_size); png_set_rows(png_ptr, info_ptr, &row_pointers);
但“pixel size”这一术语在libpng文档的其他地方均未提及,我想了解它的具体含义以及计算方式。
含义与计算方法
pixel size指单个像素在内存中占用的字节数,由图像的颜色类型和位深度共同决定,具体计算步骤如下:
确定每个像素的总位数:
- 灰度图(
PNG_COLOR_TYPE_GRAY):总位数 = 位深度 - 灰度带Alpha通道(
PNG_COLOR_TYPE_GRAY_ALPHA):总位数 = 位深度 × 2 - 真彩色图(
PNG_COLOR_TYPE_RGB):总位数 = 位深度 × 3 - 真彩色带Alpha通道(
PNG_COLOR_TYPE_RGB_ALPHA):总位数 = 位深度 × 4 - 索引色图(
PNG_COLOR_TYPE_PALETTE):总位数 = 位深度(每个像素对应调色板索引,占用位数由位深度指定)
- 灰度图(
将总位数转换为字节数:
使用整数向上取整运算,公式为:pixel_size = (总位数 + 7) / 8
常见场景示例
- 8位灰度图:
(8 +7)/8 = 1字节/像素 - 24位真彩色图:
(8×3 +7)/8 = 3字节/像素 - 32位RGBA图:
(8×4 +7)/8 =4字节/像素 - 16位灰度带Alpha:
(16×2 +7)/8 =4字节/像素 - 4位索引色图:
(4 +7)/8 =1字节/像素
更可靠的替代方式
手动计算容易出错,实际开发中可以直接调用libpng的png_get_rowbytes()函数获取每行的总字节数,再除以图像宽度得到pixel size:
png_uint_32 row_bytes = png_get_rowbytes(png_ptr, info_ptr); int pixel_size = row_bytes / width;
内容的提问来源于stack exchange,提问作者Thomas Fritz
相关产品推荐
相关产品推荐

