我想了解在构建NSBitmapImageRep时"bytesPerRow“是如何计算的(在我的例子中,是从一个浮点数组映射到一个灰度位图)。
澄清这个细节将帮助我理解内存是如何从一个浮点数组映射到一个字节数组(0-255,无符号字符;这两个数组都没有在下面的代码中显示)。
苹果公司的文档说,这个数字是“根据图像的宽度,每个样本的位数,如果数据是网状配置,每个像素的样本数”来计算的。
我在进行这个“计算”时遇到了困难,所以我建立了一个简单的循环来根据经验找到结果。下面的代码运行得很好:
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);
}并产生结果:
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位)?
感谢你的见解,我很难想象它是如何工作的。
发布于 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。
https://stackoverflow.com/questions/9146472
复制相似问题