gpt4 book ai didi

cocoa - 如何从 NSBitmapImageRep 计算 "bytesPerRow"

转载 作者:行者123 更新时间:2023-12-03 17:42:19 29 4
gpt4 key购买 nike

我想了解在构建 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com