首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BitmapData.Stride对GetPixelFormatSize(BitmapData.PixelFormat)除以8

BitmapData.Stride对GetPixelFormatSize(BitmapData.PixelFormat)除以8
EN

Stack Overflow用户
提问于 2020-02-09 16:15:46
回答 1查看 230关注 0票数 2

在试图更好地理解Bitmap和锁定位的所有属性的同时,我创建了一个10x1px映像,具有以下属性:

Pixel format:Format24bppRgb

指定格式为每像素24位;红色、绿色和蓝色组件各使用8位。

Color depth in bits: 24 (3 bytes)

这意味着我有10个像素,每个像素需要3个字节,这意味着我需要创建一个长度为30的字节数组,以便使用:Marshal.Copy(lockedBitmapData.Scan0, bytesArray, 0, 30);复制所有图像数据。

步幅是一行像素的宽度(一条扫描线),四舍五入到一个四字节的边界。

这是否意味着当我访问BitmapData.Stride时,它总是返回一个整数,就好像PixelFormat是32bit变体之一一样?

为什么下面的代码会导致两个额外的字节,即0,而不是10,即0?或者它是2,因为它将30字节乘以32作为最近的字节长度,可以被4除以,正如doc所说的那样?我想我误解了文档,并期望它在计算步幅时为每个像素计算4个字节。

代码语言:javascript
运行
复制
byte[] bytesArray = new byte[lockedBitmapData.Stride];
Marshal.Copy(lockedBitmapData.Scan0, bytesArray, 0, lockedBitmapData.Stride);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-09 17:05:55

步幅被理解为从一条线到一条线的距离,而不是从像素到像素的距离。预期pixels_per_line * bytes_per_pixel的差异是由于每个逻辑行末尾的填充造成的。所以你的第二个解释基本上是正确的,

32是最接近的字节长度,可以被4整除,如doc所说。

我只想加上“是填充,以确保完整的4字节边界”,因为16和24同样可以被4整除。这篇文章包含一张图片,这个答案包含补充信息。

其根本原因与硬件有关。如果二维数据结构是对内存对齐的(在本例中,DWORD对齐),则对该数据的查找(索引)和大容量操作运行速度要快得多。

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

https://stackoverflow.com/questions/60138664

复制
相关文章

相似问题

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