这是那个函数,其中那两个{}中的<和>=是原来的,<>和=是我自己改的,作用是生成不规则窗体用的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.我用图片外面一圈紫色作透明色,这样之后不规则窗体的外框还有很细的一条紫色(大概一个像素宽),怎么搞定?或者哪位大哥把这个函数写个详细点的注释吧,我看不太懂:(

解决方案 »

  1.   

    r*0.3+0.59*g+0.11*b这公式是取灰度值这个也是,HiByte(r * 77 + g * 151 + b * 28);YUV色系和RGB色系的换算公式:Y为灰度值、U和V为色调值Y =  0.299R + 0.587G + 0.114B
    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这类问题还是自己多调整调整吧,不就多了条线吗?自己一条条语句搞懂不就自然解决了?