显示器16增强色,怎样分解处R G B分色!!(200分)

W

wukw

Unregistered / Unconfirmed
GUEST, unregistred user!
显示器16增强色,抓图片的一个象素的占有了2Byte,怎样分解处R G B分色!!
我看了MSDN,rgb各站5Bit,所以5×3=15, 1bit保留
(显示器32真彩时,一个象素占4BYTE,为R G B Alpha这个可以搞定)

这就是说R G B(0-31)的范围,怎么与0-255的正常范围匹配呢??怎么转化到0-255的范围???
用GetPixel得到的(16位下)就是正常的0-255色!但这个函数运行很慢!

我这样试了试:
float factor=255.0/31.0;
R=r*factor;
这样可以,但有点小差别(与GetPixel())
如果这样可以,我只想知道,这样是不是正确地!
 
其实很简单,将五位的分色数据左移三位即可,不要用浮点算法。
 
告诉你一个非常巧妙的方法
TRGBColor=Record
case integer of
0:(Color:TColor);
1:(R:Byte;
(G:Byte;
(B:Byte);
end;
var
RGBColor:TRGBColor;
begin
RGBColor.Color:=...;
RGB.r RGB.g RGB.B 就是RGB的值Byte(0-255)

经典型
var
Color:TColor;
I:Integer;
R,G,B:Byte;
begin
I:=ColorToRGB(Color);
R:=GetRValue(I);
G:=GetGValue(I);
B:=GetBValue(I);
end;
 
GetRValue
GetGValue
GetBValue是delphi的函数吗?[:D]
 
wukw,你好,你的理解基本对的,两者是一个系数关系,也就是你的 factor取整数8就可以了,
下面给出一个快速的2进制位转换函数,希望对你有用!:)

function HighColor2TrueColor(color16 :word):TColor;
begin
Result := RGB(
(color16 and (31 shl 10)) shr 7,
(color16 and (31 shl 5)) shr 2,
(color16 and (31 )) shl 3);
end;
 

TO:laisweet
API函数,看Windows单元
 
谢谢影子!
 
多人接受答案了。
 
顶部