这是那个函数,其中那两个{}中的<和>=是原来的,<>和=是我自己改的,作用是生成不规则窗体用的Rgn
function TForm1.CreateRgn(rgnBitmap: TBitmap; transColor: TColor): HRGN;
var
i, j: Integer;
width, height: Integer;
left, right: Integer;
rectRgn: HRGN;
begin
Result := 0; // NULL in C/C++
width := rgnBitmap.Width;
height := rgnBitmap.Height;
for i := 0 to height - 1 do
begin
left := -1;
for j := 0 to width - 1 do
begin
if left < 0 then
begin
if (GetColorDegree(rgnBitmap.Canvas.Pixels[j, i]) {<}<> GetColorDegree(transColor)) then
left := j;
end
else
if (GetColorDegree(rgnBitmap.Canvas.Pixels[j, i]) {>=}= GetColorDegree(transColor)) then
begin
right := j;
rectRgn := CreateRectRgn(left, i, right, i + 1);
if Result = 0 then
Result := rectRgn
else
begin
CombineRgn(Result, Result, rectRgn, RGN_OR);
DeleteObject(rectRgn);
end;
left := -1;
end;
end;
if left >= 0 then
begin
rectRgn := CreateRectRgn(left, i, width, i + 1);
if Result = 0 then
Result := rectRgn
else
begin
CombineRgn(Result, Result, rectRgn, RGN_OR);
DeleteObject(rectRgn);
end;
end;
end;
end;问题:
1.为什么要比较GetColorDegree(就是r*0.3+0.59*g+0.11*b)而不是直接比较color?
2.我用图片外面一圈紫色作透明色,这样之后不规则窗体的外框还有很细的一条紫色(大概一个像素宽),怎么搞定?或者哪位大哥把这个函数写个详细点的注释吧,我看不太懂:(
function TForm1.CreateRgn(rgnBitmap: TBitmap; transColor: TColor): HRGN;
var
i, j: Integer;
width, height: Integer;
left, right: Integer;
rectRgn: HRGN;
begin
Result := 0; // NULL in C/C++
width := rgnBitmap.Width;
height := rgnBitmap.Height;
for i := 0 to height - 1 do
begin
left := -1;
for j := 0 to width - 1 do
begin
if left < 0 then
begin
if (GetColorDegree(rgnBitmap.Canvas.Pixels[j, i]) {<}<> GetColorDegree(transColor)) then
left := j;
end
else
if (GetColorDegree(rgnBitmap.Canvas.Pixels[j, i]) {>=}= GetColorDegree(transColor)) then
begin
right := j;
rectRgn := CreateRectRgn(left, i, right, i + 1);
if Result = 0 then
Result := rectRgn
else
begin
CombineRgn(Result, Result, rectRgn, RGN_OR);
DeleteObject(rectRgn);
end;
left := -1;
end;
end;
if left >= 0 then
begin
rectRgn := CreateRectRgn(left, i, width, i + 1);
if Result = 0 then
Result := rectRgn
else
begin
CombineRgn(Result, Result, rectRgn, RGN_OR);
DeleteObject(rectRgn);
end;
end;
end;
end;问题:
1.为什么要比较GetColorDegree(就是r*0.3+0.59*g+0.11*b)而不是直接比较color?
2.我用图片外面一圈紫色作透明色,这样之后不规则窗体的外框还有很细的一条紫色(大概一个像素宽),怎么搞定?或者哪位大哥把这个函数写个详细点的注释吧,我看不太懂:(
U = -0.148R - 0.289G + 0.437B
V = 0.615R - 0.515G - 0.100BR = Y + 1.140V
G = Y - 0.395U - 0.581V
B = Y + 2.032U这类问题还是自己多调整调整吧,不就多了条线吗?自己一条条语句搞懂不就自然解决了?