You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改pf24bit阴影代码适配pf32bit位图?解决截图宽度异常

适配pf32bit的阴影效果代码修改方案

核心问题分析

原代码针对pf24bit(3字节/像素)编写,而pf32bit是4字节/像素(含Alpha通道),同时Windows位图存在行字节对齐要求(必须是4的倍数)——这正是截图时宽度方向阴影失效的关键:原代码手动计算行长度时未考虑对齐填充,导致处理到填充字节时出错,截断了阴影效果。

具体修改步骤

1. 动态获取单像素字节数

替换原代码中固定的3(对应pf24bit),改用系统函数动态计算对应格式的单像素字节数:

PixelBytes := GetPixelFormatSize(Bitmap.PixelFormat) div 8;

注:GetPixelFormatSize返回对应格式的总位数,除以8后自动适配pf24bit(3字节)、pf32bit(4字节)等所有常见像素格式。

2. 用Scanline处理行地址,规避对齐问题

放弃手动计算行长度,直接使用位图自带的Scanline属性获取每行的真实起始地址,自动处理Windows位图的行对齐填充:

var
  I: Integer;
  Row: PByte;
begin
  for I := 0 to Bitmap.Height - 1 do
  begin
    Row := Bitmap.Scanline[I];
    // 针对当前行的像素进行阴影处理
  end;
end;

3. 调整像素遍历逻辑

根据PixelBytes的值适配不同格式的像素访问:

var
  X, Y: Integer;
  PixelPtr: PByte;
begin
  for Y := 0 to Bitmap.Height - 1 do
  begin
    PixelPtr := Bitmap.Scanline[Y];
    for X := 0 to Bitmap.Width - 1 do
    begin
      // 处理RGB通道
      PixelPtr[0] := ...; // 蓝色通道
      PixelPtr[1] := ...; // 绿色通道
      PixelPtr[2] := ...; // 红色通道
      // 若为pf32bit,按需处理Alpha通道
      if PixelBytes = 4 then
        PixelPtr[3] := ...;
      // 移动到下一个像素
      Inc(PixelPtr, PixelBytes);
    end;
  end;
end;

4. 可选:强制转换位图格式

若需要统一处理,可在修改前将位图强制转换为目标格式:

if Bitmap.PixelFormat <> pf32bit then
  Bitmap.PixelFormat := pf32bit;

效果验证

修改后重新测试屏幕截图场景:

  • 阴影效果应覆盖整个位图宽度,高度方向保持正常;
  • 同时兼容pf24bit、pf32bit等常见像素格式。

内容的提问来源于stack exchange,提问作者FLASHCODER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:54:27