为啥我的图像的每行字节数大于其每像素字节数乘以其宽度?

Posted

技术标签:

【中文标题】为啥我的图像的每行字节数大于其每像素字节数乘以其宽度?【英文标题】:Why is my image's Bytes per Row more than its Bytes per Pixel times its Width?为什么我的图像的每行字节数大于其每像素字节数乘以其宽度? 【发布时间】:2013-04-10 19:48:02 【问题描述】:

我正在将图像转换为 MOV 文件,并且发生了一件有趣的事情。我记录了每个颜色分量的位数、每个像素的位数和每行的字节数。这是我的代码:

NSLog(@"Image width: %d, Height: %d", CGImageGetWidth(image), CGImageGetHeight(image));
NSLog(@"BPC: %d \ BPP: %d \ ByPR: %d", CGImageGetBitsPerComponent(image), CGImageGetBitsPerPixel(image), CGImageGetBytesPerRow(image));

这是我的输出:

图像宽度:300,高度:300(一切都符合预期) BPC:8(每种颜色 8 位......到目前为止一切都很好) BPP:32(32 = 4 个分量 ARGB * 每种颜色 8 位......知道了) ByPR:1216(每行 300 像素 * 每像素 4 字节 = 每行 1200 字节)

为什么我每行记录 1216 个字节,而不是 1200 个?顺便说一句,这不仅仅是侥幸。当我根据缓冲区大小的这些数字创建视频时,它可以工作。当我以每行 1200 字节创建它时,我得到了一些混乱的混叠效果。

想法?!

【问题讨论】:

其实我需要做同样的事情。你能给我将图像转换为mov的代码吗?做不到也没关系。我的电子邮件是animesh1789@gmail.com。非常感谢。 我的需求略有不同:新肾和金钱。任何数量。如果能分享就太好了Tha-a-anks! 【参考方案1】:

系统希望图像是每行 64 字节的倍数,这可能是为了提高缓存行对齐的性能。 1200 不是 64 的倍数,但 1216 是。

【讨论】:

有趣......为什么,或者这很随意?只是让分配缓冲区更容易?另外,您是否有任何可能专门针对 CGImage 表明这一点的文档?谢谢! 就像我说的,我认为这是由于缓存行的行为。 CPU 总是一次加载整个高速缓存行。我不记得有任何文件可以指出你。 有没有办法阻止它这样做?我可以设置我的字节权限吗? 如果你有不同bytesPerRow的原始像素数据,你可以使用CGImageCreate。如果您使用系统的图像加载功能,您将得到系统选择的内容。 确实,我有来自另一个图像的原始像素缓冲区,每行具有不同的字节数。如果我只是复制所有内容并创建一个新图像,它会创建一个倾斜的图像,其中像素从右侧溢出并从左侧返回。复制时如何识别和去除每行的额外像素?

以上是关于为啥我的图像的每行字节数大于其每像素字节数乘以其宽度?的主要内容,如果未能解决你的问题,请参考以下文章

位图存储图像数据每行字节数为4的倍数

如何使用 C++ 正确计算 BMP 图像中每个像素的字节数?

图像跨距的概念

c语言 int的范围不是-32768~32767吗?为啥我输入了大于的数还是成立.

如何在 Dart/Flutter 中读取本地图像文件的字节数?

洛谷——P2556 [AHOI2002]黑白图像压缩