Delphi TBitmap - 为什么 Pixels 和 ScanLine 不同?

2023-12-10

在使用 32 位 TBitmap 时,我从 Canvas.Pixels 切换到 ScanLine。

然后我将值设置为红色,却发现它显示为蓝色。

知道为什么吗?

这是代码摘录:

procedure TForm1.FormPaint(Sender: TObject);
var
  varBitmap: TBitmap;
  pLock: PIntegerArray;
  iColor: integer;
begin
  varBitmap := TBitmap.Create;
  varBitmap.PixelFormat := pf32bit;
  varBitmap.Width := 800;
  varBitmap.Height := 600;

  // Set Pixels to Red
  varBitmap.Canvas.Pixels[0, 0] := $0000FF;

  // Shows $FF0000 (blue)
  pLock := varBitmap.ScanLine[0];
  iColor := pLock[0];
  ShowMessageFmt('%x', [iColor]);

  // Set ScanLine to Red
  pLock[0] := $0000FF;

  // Displays a blue pixel
  Canvas.Draw(0, 0, varBitmap);
end;

似乎 TColor 与内存中的不一样,但这没有意义。

欢迎任何建议。 ;)


VCL 位图类,TBitmap是 Windows 本机设备独立位图 (DIB) 的包装器。这些位图对象可以存储多种不同像素格式的位图。它们可以是单色的,每像素一位,最多每像素 32 位,这是您正在使用的格式。它们还可以用于存储基于调色板的位图,其中每个像素都保存颜色表的索引。

访问您引用的像素数据的两种方法是Pixels的财产TCanvasScanLine的财产TBitmap.

The Pixels的财产TCanvas是 GDI 的包装GetPixel and SetPixel功能。这些是运行在的高级函数COLORREF价值观。的文档COLORREF says:

低位字节包含红色相对强度的值;第二个字节包含绿色值;第三个字节包含蓝色值。高位字节必须为零。单字节的最大值为 0xFF。

换句话说,一个COLORREFvalue 有固定的像素颜色编码方式。这GetPixel and SetPixel函数主要处理固定值之间的转换COLORREF形式和底层原始位图像素数据。另请注意,COLORREF不能代表alpha值。这COLORREF值的格式为 $00BBGGRR。

另一方面,ScanLine的财产TBitmap返回一个指向底层 DIB 对象的原始像素数据的指针。您此处使用的数据是 32bpp 像素数据,该数据的约定是以 $AARRGGBB 格式存储。窗户文档对于 32bpp 数据说:

位图最多有 2^32 种颜色。如果 BITMAPINFOHEADER 的 biCompression 成员为 BI_RGB,则 BITMAPINFO 的 bmiColors 成员为 NULL。位图数组中的每个 DWORD 代表像素的蓝色、绿色和红色的相对强度。蓝色的值位于最低有效 8 位中,随后是绿色和红色各 8 位。每个 DWORD 中的高字节不被使用。

所以事实上这段文字是不正确的并且已经过时了。每个中的高字节DWORD事实上,如果使用的话,就是 alpha 通道。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi TBitmap - 为什么 Pixels 和 ScanLine 不同? 的相关文章

  • 调用泛型类型的方法?

    为什么下面的代码在 Delphi XE 中会产生错误 unit UTest interface type TTest class public procedure Foo
  • 能否从 Vista Shell 获取 48x48 或 64x64 图标?

    如果 Vista Shell 中存在 48x48 或 64x64 图标 如何使用 SHGetFileInfo 获取在 TImage 中显示图标的句柄 我想从图像列表中选择一个代表文件夹路径的图标 并在 Timage 中显示 48x48 或
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • 将记录转换为序列化表单数据以通过 HTTP 发送

    有没有办法转换此记录 TError record code Word message String end TState record caption String address Cardinal counters TArray
  • 如何将 TGifImage 中的帧提取为位图?

    下面的演示尝试在表单的画布上绘制 GIF 这不起作用 图像不会前进 如何让它发挥作用 procedure TForm1 FormCreate Sender TObject begin GIF TGIFImage Create GIF Loa
  • Delphi DataSnap REST 服务器从 TStream 返回 JSON 数组,而不是二进制

    我有一个与 Android 客户端通信的 REST 服务器 我将它从 XE3 ish 升级到 Berlin 其中一个服务器方法返回一个包含 jpeg 的 TStream 并且工作得很好 很高兴将图像作为二进制图像返回 升级到 Berlin
  • 如何将 JSON 字符串转换为图像?

    我有一个将图像转换为 JSON 数组的应用程序 并将其保存到 blob 字段中 function getImage String var memorystream TMemoryStream jsonArray TJSONArray beg
  • 我需要避免尝试更新连接到 TSQLQuery 的 Delphi TClientDataset 中的非物理字段

    概要 我的代码正在尝试更新 Delphi XE 中的非物理字段TClientDataset 连接到TSQLQuery以其SQL属性集 作为运行时的结果创建Open命令 我有一个TClientDataset连接到一个TDatasetProvi
  • 将位图旋转 90 度

    我有一个1 个 64 位整数 我需要在 8 x 8 区域中旋转 90 度 最好使用直接位操作 我想不出任何方便的算法 例如 这个 0xD000000000000000 110100000000000000000000000000000000
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • Android 中使用黑白 alpha 蒙版的高效位图蒙版

    我想用黑白 alpha 蒙版来掩盖位图 我的蒙版图像是黑白的 黑色区域意味着透明 白色区域意味着不透明 我需要的是 当我使用此蒙版图像来蒙版任何其他图像时 如果蒙版图像的相应区域为黑色 则生成的图像区域应为透明 否则 生成的图像区域应该是不
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 如何将数据库查询的行转换为 XML 文件?

    我正在开发一个 Delphi 应用程序 该应用程序需要从一段工作中获取行并将其转换为单个 XML 文件 以便上传到第三方 Web 服务 有没有可用的组件或库可以做到这一点 如果不是 那么构建 DB2XML 转换器的最佳代码方法是什么 我注意
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • 如何从 Delphi 中的函数返回对象而不导致访问冲突?

    我有一个返回 TStringList 的 delphi 函数 但是当我返回一个值并尝试使用它时 我收到一个访问冲突错误 即 myStringList FuncStringList myStringList Items Count lt Th
  • 调试器异常错误和内存超调

    我尝试运行以下代码 但它显示有关内存地址的错误 并显示一条消息 循环后 n 可能未定义 请看一看 var n max integer n integer r R1 f h0 Array of Real const h 0 00889 nip
  • 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

    我正在使用 Delphi 2009 和 svn 中最新的 Indy 10 通过 SMTP 发送电子邮件 但它不适用于 Gmail Google Apps 托管域 当我尝试发送电子邮件时 我收到 必须首先发出 STARTTLS 命令 我尝试用
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 画布:尝试使用回收的位图错误

    我是一个相当新的程序员 所以任何建议将不胜感激 我有一个类 每次调用它时都会在循环中运行 AsyncTask AsyncTask 看起来像这样 public class LoadImageTask extends AsyncTask
  • 加载位图图像至特定尺寸

    我正在尝试使用 allegro 将位图加载到特定大小 al crate bitmap x y 创建特定大小的位图 al load bitmap filename 加载我需要的图像 但为其原始大小 我需要将位图加载到我设置的大小 有任何想法吗

随机推荐

  • 仅删除 HTML 字符串中标签之间的多余空格

    嗨 我有一个 HTML 字符串 例如 div p You have received an alert from project span class fields Project Name span br p p span class f
  • 我可以暂停和恢复线程吗?

    我正在尝试创建一个线程 它在后台执行操作 我需要能够在需要时有效地 暂停 它 并在以后再次 恢复 它 另外 如果当我 暂停 线程时线程正在执行某些操作 它应该使调用线程等待 直到它完成正在执行的操作 我对 Python 中的多线程还很陌生
  • 如何使用 REST 将数据从 AngularJS 发布到 Struts 2

    我需要从客户端获取到服务器端的值 我正在使用 AngularJS 和 Struts2 REST 我的控制器没有获取传递的值 还是我传递或使用 RESTful 控制器时出错了 这是我的代码 angularcontroller js app c
  • Android Studio 意外的顶级异常:

    今天 我遇到了一个巨大的错误 不允许我在手机上运行示例项目 当 Android Studio 构建项目时 它首先显示以下目标 UP TO DATE demoproject processDebugResources UP TO DATE d
  • 如何获取java中两个日期之间的日期列表?如何还包含/排除开始日期/结束日期?

    我已经尝试过堆栈溢出中给出的示例java中如何获取两个日期之间的日期列表 该代码完美运行 但有一个小问题 我的列表中也没有得到结束日期 如何选择包含 排除开始日期并包含结束日期 我可以使用remove 和add 手动执行此操作吗 或者Jod
  • 将 checkstyle-configuration 从声纳导入到 eclipse-checkstyle-plugin

    我想从声纳导出 checkstyle 规则并将它们导入到 checkstyle eclipse 插件中 不幸的是 sonar 将 checkstyle 规则导出到 csv 文件 但 checkstyle 插件只接受 xml 文件的导入 有什
  • SignalR 2.2 和 ARR3.0 负载平衡

    我正在使用 signalr2 2 Web 应用程序并托管在 IIS 8 中 这里我尝试使用ARR3 0为我的应用程序实现负载均衡 在我的服务器场中 我连接了两台服务器并将路由规则设置为 加权循环 每个服务器都有一个带有 HTML 页面的 j
  • 如何将文本文件从 jar 复制到 jar 外部的文件中?

    假设我的 jar 包 com test io 中有一个名为 test txt 的文件 我将如何编写一个类来检索该文本文件 然后将内容复制到文件系统上的新文件中 假设所述 jar 在您的类路径上 URL url getClassLoader
  • 我找不到 Android keytool

    我正在尝试遵循 Android 映射教程并且到了这部分我必须获得 API 密钥 我已经找到了我的debug keystore但似乎没有keytool应用程序在目录中 C Documents and Settings tward androi
  • Range(Cells()) 中的运行时错误 1004

    我在许多宏中有以下代码 但它需要大量我不需要的信息 公式如下 Range A1 h BD h Value Worksheets ABC1 Range A h BD h Value 我尝试将公式更改为更动态的版本 如下 Sub MFGI NA
  • 将 P 值添加到组内比较箱线图

    我正在尝试创建一个箱线图 它仅显示箱线图中每个条形的组内的显着 p 值 例如 它会比较 I1 和 SI2 的 一般 良好 非常好 等 我尝试使用以下代码来实现上面的情节 library ggplot2 library dplyr data
  • 三元运算符与 if 语句的优点

    我正在浏览一些代码 发现其中有一些三元运算符 这段代码是我们使用的一个库 它应该非常快 我在想除了空间之外我们是否还可以节省任何东西 你的经验是什么 表现 三元运算符的性能与编写良好的等效运算符不应有差异if else声明 它们很可能解析为
  • Android Studio 通知管理器错误

    我编写了一段代码 以便在信标范围内时弹出通知 我的通知代码如下 private void showNotification String message Log d Hay8 DCM8 Intent intent new Intent co
  • _Generic 宏中传递的指针类型不兼容

    以下代码生成 2 个警告 如问题标题中所述 include
  • 将 SceneKit 场景导出为 Collada .dae 文件的最简单方法?

    我有一个算法生成的 SceneKit 场景 我希望能够将其导出为 Collada dae 文件 例如用于 iBooks Author 中 由于 SceneKit 可以导入 Collada 文件 我认为也可能有办法导出它们 但在 API 中找
  • 使用 HttpClient 在“适配器已分离”和“无包装连接”之间切换

    所以正如我所说 当我尝试运行时 我在这两个错误之间来回跳动HttpClient execute HttpPost 得到IllegalStateException public class NetMethods private static
  • 更改占位符一部分的颜色[重复]

    这个问题在这里已经有答案了 如何只更改占位符的一部分 这是我的html div class col md 4 p class form row form row wide p div
  • actionbarsherlock 使用选项卡导航 选项卡导航

    我有一个后期需求更改 需要选项卡导航 我已经在我的应用程序中使用了 ActionBarSherlock 以前我的用户界面由活动组成 但是 据我了解 TabBar 需要片段活动吗 我有什么办法可以保留现有代码并实现 TabBar 或者这需要完
  • 使用原型继承重写方法

    我正在使用这个克隆方法进行原型继承专业 JavaScript 设计模式这基本上是相同的Crockford 的 object 函数 唯一的区别是 Crockford 添加了调用括号 但由于 F 为空 我不确定这是否重要 我认为这不是问题 cl
  • Delphi TBitmap - 为什么 Pixels 和 ScanLine 不同?

    在使用 32 位 TBitmap 时 我从 Canvas Pixels 切换到 ScanLine 然后我将值设置为红色 却发现它显示为蓝色 知道为什么吗 这是代码摘录 procedure TForm1 FormPaint Sender TO