如何修改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
相关产品推荐
相关产品推荐

