首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从NSBitmapImageRep计算"bytesPerRow“

如何从NSBitmapImageRep计算"bytesPerRow“
EN

Stack Overflow用户
提问于 2012-02-05 10:37:09
回答 1查看 2.2K关注 0票数 0

我想了解在构建NSBitmapImageRep时"bytesPerRow“是如何计算的(在我的例子中,是从一个浮点数组映射到一个灰度位图)。

澄清这个细节将帮助我理解内存是如何从一个浮点数组映射到一个字节数组(0-255,无符号字符;这两个数组都没有在下面的代码中显示)。

苹果公司的文档说,这个数字是“根据图像的宽度,每个样本的位数,如果数据是网状配置,每个像素的样本数”来计算的。

我在进行这个“计算”时遇到了困难,所以我建立了一个简单的循环来根据经验找到结果。下面的代码运行得很好:

代码语言:javascript
复制
int Ny = 1; // Ny is arbitrary, note that BytesPerPlane is calculated as we  would expect = Ny*BytesPerRow;
for (int Nx = 0; Nx<320; Nx+=64) {
    // greyscale image representation:
    NSBitmapImageRep *dataBitMapRep = [[NSBitmapImageRep alloc]
       initWithBitmapDataPlanes: nil // allocate the pixel buffer for us
       pixelsWide: Nx 
       pixelsHigh: Ny
       bitsPerSample: 8
       samplesPerPixel: 1  
       hasAlpha: NO
       isPlanar: NO 
       colorSpaceName: NSCalibratedWhiteColorSpace // 0 = black, 1 = white
       bytesPerRow: 0  // 0 means "you figure it out"
       bitsPerPixel: 8]; // bitsPerSample must agree with samplesPerPixel
    long rowBytes = [dataBitMapRep bytesPerRow];
    printf("Nx = %d; bytes per row = %lu \n",Nx, rowBytes);
}

并产生结果:

代码语言:javascript
复制
Nx = 0; bytes per row = 0 
Nx = 64; bytes per row = 64 
Nx = 128; bytes per row = 128 
Nx = 192; bytes per row = 192 
Nx = 256; bytes per row = 256 

所以我们可以看到,每行的字节数以64字节为增量跳跃,即使当Nx一直递增1到320 (我没有显示所有这些nx值)。另请注意,Nx = 320 (max)对于本讨论而言是任意的。

因此,从为字节数组分配和映射内存的角度来看,“每行字节数”是如何根据基本原理计算出来的?上面的结果是不是使得来自单个扫描线的数据可以在“字”长度边界上对齐(在我的MacBook专业版上是64位)?

感谢你的见解,我很难想象它是如何工作的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-05 11:06:05

bytesPerRow:传递0比你在评论中说的更有意义。从文档中:

如果传入的rowBytes值为0,则出于性能考虑,分配的位图数据可能会被填充到较长的字或更大的边界上。…传入一个非零值允许您指定精确的行进。

所以你会看到它一次增加64个字节,因为这就是AppKit决定对其进行舍入的方式。

每行字节数的最低要求要简单得多。它是每像素的字节数乘以每行的像素。就这样。

对于浮点数支持的位图图像表示,您应该为bitsPerSample传递sizeof(float) * 8,而每像素字节数将为sizeof(float) * samplesPerPixel。每行字节数由此而来;将每像素字节数乘以像素宽度。

同样,如果它是由无符号字节支持的,那么您应该为bitsPerSample传递sizeof(unsigned char) * 8,每像素的字节数将是sizeof(unsigned char) * samplesPerPixel

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9146472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档