- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想了解在构建 NSBitmapImageRep 时如何计算“bytesPerRow”(在我的例子中是从将 float 组映射到灰度位图)。
澄清这个细节将帮助我理解内存如何从 float 组映射到字节数组(0-255,无符号字符;下面的代码中都没有显示这些数组)。
Apple 文档称,该数字是“根据图像的宽度、每个样本的位数以及(如果数据采用网格配置)每个像素的样本数”计算得出的。
我在执行此“计算”时遇到了困难,因此我设置了一个简单的循环来根据经验查找结果。下面的代码运行得很好:
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(最大值)对于本次讨论是任意的。
那么从为字节数组分配和映射内存的角度来看,“每行字节数”是如何根据第一原理计算出来的呢?上面的结果是否可以使来自单个扫描线的数据在“字”长度边界上对齐(我的 MacBook Pro 上为 64 位)?
感谢您提供任何见解,但无法想象这是如何工作的。
最佳答案
为 bytesPerRow:
传递 0 意味着比您在评论中所说的更多。来自文档:
If you pass in a
rowBytes
value of 0, the bitmap data allocated may be padded to fall on long word or larger boundaries for performance. … Passing in a non-zero value allows you to specify exact row advances.
因此您会看到它一次增加 64 个字节,因为 AppKit 就是这样决定将其向上舍入的。
每行字节的最低要求要简单得多。它是每像素字节数乘以每行像素数。仅此而已。
对于由 float 支持的位图图像表示,您需要为 bitsPerSample
传递 sizeof(float) * 8
,每像素字节数将为 sizeof(float)*samplesPerPixel
。由此得出每行字节数;将每像素字节数乘以像素宽度。
同样,如果它由无符号字节支持,则需要为 bitsPerSample
传递 sizeof(unsigned char) * 8
,并且每像素字节数将为 sizeof(unsigned char) *samplesPerPixel
.
关于cocoa - 如何从 NSBitmapImageRep 计算 "bytesPerRow",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9146472/
我是一名优秀的程序员,十分优秀!