【问题标题】:scanline function in qimage classqimage 类中的扫描线函数
【发布时间】:2011-12-03 02:44:55
【问题描述】:

我正在开发用于编辑光栅图形的应用程序。在这个应用程序中,我必须创建与 QImage 类中的扫描线函数相同的扫描线函数。 但我对扫描线功能的工作方式以及一般的扫描线有点困惑。 例如,当我为高度为 177px 的图像调用 bytesPerLine() 时,我期望该值为 531(每个像素 3 个字节),但此函数返回 520?

另外,当我使用 uchar data = image->scanLine(y)[x] 对于 R=249 G=249 B=249 变量数据中的值为 255。 我真的不明白这个价值。 在此先感谢:)

【问题讨论】:

  • 我希望每个像素是 4 个字节,RGBA,255 可能是 alpha 通道。检查接下来的两个字节。
  • 跟进,你知道QImage是用什么Format构造的吗?这直接影响每个给定像素的字节大小和格式。从文档中:> 如果您正在访问 32-bpp 图像数据,请将返回的指针转换为 QRgb*(QRgb 具有 32 位大小)并使用它来读取/写入像素值。您不能直接使用 uchar* 指针,因为像素格式取决于底层平台上的字节顺序。使用 qRed()、qGreen()、qBlue() 和 qAlpha() 访问像素。
  • @EvanTeran:QImage 是用 Format_RGB32 格式构建的。我知道我必须将返回指针转换为 qRgb 但我有兴趣在不转换的情况下访问颜色。从 image->scanLine(y)[x] 返回的值我无法理解访问了哪个颜色值。

标签: c++ qt qimage scanline


【解决方案1】:

为了获得可靠的行为,您应该在访问原始图像数据之前检查QImage::format() 的返回值以查看使用的基础格式。

Qt 似乎更喜欢 RGB32/ARGB32 格式的真彩色,其中每个像素占用 4 个字节,无论是否存在 alpha 通道(对于 RGB32 格式,它只是用 0xff 填充)。如果您加载真彩色图像,它可能是这两种格式之一。

此外,不同平台的字节顺序可能不同,请尽可能使用QRgb 访问 32 位像素。

顺便说一句,扫描线不应该是水平的吗?我认为您应该使用width() 而不是height() 来计算扫描线的长度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-15
    • 2015-11-05
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多