我不是色盲,但是这个问题有点晕。(100分)

  • 主题发起人 主题发起人 Miros
  • 开始时间 开始时间
M

Miros

Unregistered / Unconfirmed
GUEST, unregistred user!
如下代码放到Form的OnPaint上,
我看到的是红色的背景,蓝色的矩形。(2台电脑测试都相同)
procedure TForm1.FormPaint(Sender: TObject);
var
pColor: PDWord;
I : Integer;
begin
Color := $000000FF;//红色
with TBitmap.Create do
begin
PixelFormat := pf32bit;
Width := 256;
Height:= 256;
pColor := ScanLine[Height - 1];
ZeroMemory( pColor, Width * Height * 4 );
for I := 0 to Width * Height - 1 do
begin
pColor^:= $000000FF;//注意是还是红色,可是为什么我看到的是蓝色???
Inc( pColor );
end;
BitBlt( Self.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY );
Free();
end;
end;
[:(][:(][:(][:(][:(][:(][:(][:(][:(][:(]
 
var
X, Y : Byte;
begin
with TBitmap.Create do
begin
PixelFormat := pf32bit;
Width := 256;
Height:= 256;
for X := 0 TO 255 DO
for Y := 0 TO 255 DO
Canvas.Pixels[X, Y] := $FF;
BitBlt( Self.Canvas.Handle, 0, 0, Width, Height, Canvas.Handle, 0, 0, SRCCOPY );
Free();
end;
end;
 
color和color指针不一样,高低位顺序不一样。

pColor^:= $000000FF;//注意是还是红色,可是为什么我看到的是蓝色???
=〉 pColor^:= $00FF0000;
 
我还是不解。
32位颜色在gdi中的情况,分别看下列几个windows的函数:
function GetRValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb);
end;

function GetGValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb shr 8);
end;

function GetBValue(rgb: DWORD): Byte;
begin
Result := Byte(rgb shr 16);
end;

function RGB(r, g, b: Byte): COLORREF;
begin
Result := (r or (g shl 8) or (b shl 16));
end;

通过以上4个函数得知颜色是ABGR存储的吧?
$000000FF不应当是纯红色的么?
我用d3d的时候,在A8R8G8B8的格式下纯红色则是FFFF0000因为他确实是如其格式名称那样
按照ARGB的形式存储的。
根据jenhon的方式,显示的就是红色了。
看来是GetRValue, GetGValue, GetBValue, RGB这4个
函数是不能用在32位的位图上的。
 
后退
顶部