delphi高手们帮助呀, 我用了很多方法,都不能实现画圆无锯齿,photoshop中画圆就没有锯齿.如何编写的了,请帮助.

解决方案 »

  1.   

    大版ehom好像对这方面比较专长,你问问他!
      

  2.   

    use anti-aliasing?  

    Originally written by Horst Kniebusch, modified by alioth to make it(alot) faster. 
    } procedure Antialiasing(Image: TImage; Percent: Integer); 
    type 
      TRGBTripleArray = array[0..32767] of TRGBTriple; 
      PRGBTripleArray = ^TRGBTripleArray; 
    var 
      SL, SL2: PRGBTripleArray; 
      l, m, p: Integer; 
      R, G, B: TColor; 
      R1, R2, G1, G2, B1, B2: Byte; 
    begin 
      with Image.Canvas do 
      begin 
        Brush.Style  := bsClear; 
        Pixels[1, 1] := Pixels[1, 1]; 
        for l := 0 to Image.Height - 1 do 
        begin 
          SL := Image.Picture.Bitmap.ScanLine[l]; 
          for p := 1 to Image.Width - 1 do 
          begin 
            R1 := SL[p].rgbtRed; 
            G1 := SL[p].rgbtGreen; 
            B1 := SL[p].rgbtBlue;         // Left 
            if (p < 1) then m := Image.Width 
            else 
              m := p - 1; 
            R2 := SL[m].rgbtRed; 
            G2 := SL[m].rgbtGreen; 
            B2 := SL[m].rgbtBlue; 
            if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then 
            begin 
              R := Round(R1 + (R2 - R1) * 50 / (Percent + 50)); 
              G := Round(G1 + (G2 - G1) * 50 / (Percent + 50)); 
              B := Round(B1 + (B2 - B1) * 50 / (Percent + 50)); 
              SL[m].rgbtRed := R; 
              SL[m].rgbtGreen := G; 
              SL[m].rgbtBlue := B; 
            end;         //Right 
            if (p > Image.Width - 2) then m := 0 
            else 
              m := p + 1; 
            R2 := SL[m].rgbtRed; 
            G2 := SL[m].rgbtGreen; 
            B2 := SL[m].rgbtBlue; 
            if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then 
            begin 
              R := Round(R1 + (R2 - R1) * 50 / (Percent + 50)); 
              G := Round(G1 + (G2 - G1) * 50 / (Percent + 50)); 
              B := Round(B1 + (B2 - B1) * 50 / (Percent + 50)); 
              SL[m].rgbtRed := R; 
              SL[m].rgbtGreen := G; 
              SL[m].rgbtBlue := B; 
            end;         if (l < 1) then m := Image.Height - 1 
            else 
              m := l - 1; 
            //Over 
            SL2 := Image.Picture.Bitmap.ScanLine[m]; 
            R2  := SL2[p].rgbtRed; 
            G2  := SL2[p].rgbtGreen; 
            B2  := SL2[p].rgbtBlue; 
            if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then 
            begin 
              R := Round(R1 + (R2 - R1) * 50 / (Percent + 50)); 
              G := Round(G1 + (G2 - G1) * 50 / (Percent + 50)); 
              B := Round(B1 + (B2 - B1) * 50 / (Percent + 50)); 
              SL2[p].rgbtRed := R; 
              SL2[p].rgbtGreen := G; 
              SL2[p].rgbtBlue := B; 
            end;         if (l > Image.Height - 2) then m := 0 
            else 
              m := l + 1; 
            //Under 
            SL2 := Image.Picture.Bitmap.ScanLine[m]; 
            R2  := SL2[p].rgbtRed; 
            G2  := SL2[p].rgbtGreen; 
            B2  := SL2[p].rgbtBlue; 
            if (R1 <> R2) or (G1 <> G2) or (B1 <> B2) then 
            begin 
              R := Round(R1 + (R2 - R1) * 50 / (Percent + 50)); 
              G := Round(G1 + (G2 - G1) * 50 / (Percent + 50)); 
              B := Round(B1 + (B2 - B1) * 50 / (Percent + 50)); 
              SL2[p].rgbtRed := R; 
              SL2[p].rgbtGreen := G; 
              SL2[p].rgbtBlue := B; 
            end; 
          end; 
        end; 
      end; 
    end; 
    //Example: 
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      Antialiasing(Image1, 80); 
    end;