如何在Delphi的TCanvas上替换颜色?

问题描述 投票:-1回答:2

如何在Delphi XE2的TCanvas上替换颜色?以下代码的运行速度非常慢:

  for y := ARect.Top to ARect.Top + ARect.Height - 1 do
    for x := ARect.Left to ARect.Left + ARect.Width - 1 do
      if Canvas.Pixels[x, y] = FixedColor then
        Canvas.Pixels[x, y] := Canvas.Pixels[ARect.Left, ARect.Top];
delphi graphics delphi-xe2 tcanvas
2个回答
1
投票
var aBitmap: TBitmap; x, y: Integer; aPixel: PRGBTriple; ... aBitmap := TBitmap.Create; try aBitmap.PixelFormat := pf24bit; aBitmap.Height := ARect.Height; aBitmap.Width := ARect.Width; aBitmap.Canvas.CopyRect(TRect.Create(0, 0, aBitmap.Width, aBitmap.Height), Canvas, ARect); for y := 0 to aBitmap.Height - 1 do for x := 0 to aBitmap.Width - 1 do begin aPixel := aBitmap.ScanLine[y]; Inc(aPixel, x); if (aPixel^.rgbtRed = GetRValue(FixedColor)) and (aPixel^.rgbtGreen = GetGValue(FixedColor)) and (aPixel^.rgbtBlue = GetBValue(FixedColor)) then aPixel^ := PRGBTriple(aBitmap.ScanLine[y])^; end; Canvas.Draw(ARect.Left, ARect.Top, aBitmap); finally aBitmap.Free; end;

0
投票
对于懒惰的人(像我一样,这是完整的代码:

procedure ReplaceColor(BMP: TBitmap; OldColor, NewColor: TColor); VAR x, y: Integer; R,G,B: Byte; R_,G_,B_: Byte; aPixel: PRGBTriple; begin R:= GetRValue(OldColor); G:= GetGValue(OldColor); B:= GetBValue(OldColor); R_:= GetRValue(NewColor); G_:= GetGValue(NewColor); B_:= GetBValue(NewColor); BMP.PixelFormat := pf24bit; for y := 0 to BMP.Height - 1 do for x := 0 to BMP.Width - 1 do begin aPixel := BMP.ScanLine[y]; Inc(aPixel, x); if (aPixel^.rgbtRed = R) AND (aPixel^.rgbtGreen = G) AND (aPixel^.rgbtBlue = B) then begin aPixel^.rgbtRed := R_; aPixel^.rgbtGreen := G_; aPixel^.rgbtBlue := B_; end; end; end; procedure ReplaceColor(BMP: TBitmap; OldColor, NewColor: TColor; ToleranceR, ToleranceG, ToleranceB: Byte); VAR x, y: Integer; R,G,B: Byte; R_,G_,B_: Byte; aPixel: PRGBTriple; begin R:= GetRValue(OldColor); G:= GetGValue(OldColor); B:= GetBValue(OldColor); R_:= GetRValue(NewColor); G_:= GetGValue(NewColor); B_:= GetBValue(NewColor); BMP.PixelFormat := pf24bit; for y := 0 to BMP.Height - 1 do for x := 0 to BMP.Width - 1 do begin aPixel := BMP.ScanLine[y]; Inc(aPixel, x); if (abs(aPixel^.rgbtRed - R)< ToleranceR) AND (abs(aPixel^.rgbtGreen- G)< ToleranceG) AND (abs(aPixel^.rgbtBlue - B)< ToleranceB) then begin aPixel^.rgbtRed := R_; aPixel^.rgbtGreen := G_; aPixel^.rgbtBlue := B_; end; end; end;

© www.soinside.com 2019 - 2024. All rights reserved.