Replace one color with another.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1601 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
yangjixian
2011-04-27 07:57:44 +00:00
parent 755d1dbc8d
commit e9d6964f96
7 changed files with 1656 additions and 1552 deletions

View File

@@ -60,6 +60,7 @@ type
procedure RGBDelta(RedChange, GreenChange, BlueChange: integer); procedure RGBDelta(RedChange, GreenChange, BlueChange: integer);
procedure Brightness(ValueChange: integer); procedure Brightness(ValueChange: integer);
procedure Contrast(ValueChange: integer); procedure Contrast(ValueChange: integer);
procedure ColorReplace(ColorFrom, ColorTo: TColor);
property ScanLine[Row: integer]: pRGBATriple read GetScanLine; property ScanLine[Row: integer]: pRGBATriple read GetScanLine;
procedure FillEllipse(X1, Y1, X2, Y2: integer); virtual; procedure FillEllipse(X1, Y1, X2, Y2: integer); virtual;
procedure CutToClipboard; virtual; procedure CutToClipboard; virtual;
@@ -127,6 +128,7 @@ function GetRColor(const Color: TColor): byte;
function GetGColor(const Color: TColor): byte; function GetGColor(const Color: TColor): byte;
function GetBColor(const Color: TColor): byte; function GetBColor(const Color: TColor): byte;
procedure SprayPoints(aCanvas: TCanvas; X, Y: integer; Radians: integer; PColor: TColor); procedure SprayPoints(aCanvas: TCanvas; X, Y: integer; Radians: integer; PColor: TColor);
procedure DLBMPColorReplace(aBitmap: TDLBitmap; ColorFrom, ColorTo: TColor);
implementation implementation
@@ -424,6 +426,11 @@ begin
end; end;
procedure TDLBitmap.ColorReplace(ColorFrom, ColorTo: TColor);
begin
DLBMPColorReplace(Self, ColorFrom, ColorTo);
end;
constructor TTextEdit.Create(AOwner: TComponent); constructor TTextEdit.Create(AOwner: TComponent);
begin begin
inherited; inherited;

View File

@@ -260,9 +260,9 @@ begin
for j := 0 to ABitmap.Width - 1 do for j := 0 to ABitmap.Width - 1 do
begin begin
LNew := LScan[j]; LNew := LScan[j];
LScan[j].rgbtBlue := LScan[j].rgbtBlue * Value div 100; //Value; //LNew.rgbtBlue; LScan[j].rgbtBlue := LScan[j].rgbtBlue * Value div 100;
LScan[j].rgbtGreen := LScan[j].rgbtGreen * Value div 100; //LNew.rgbtGreen; LScan[j].rgbtGreen := LScan[j].rgbtGreen * Value div 100;
LScan[j].rgbtRed := LScan[j].rgbtRed * Value div 100; //LNew.rgbtRed; LScan[j].rgbtRed := LScan[j].rgbtRed * Value div 100;
end; end;
end; end;
ABitmap.InvalidateScanLine; ABitmap.InvalidateScanLine;
@@ -596,5 +596,29 @@ begin
end; end;
end; end;
procedure DLBMPColorReplace(aBitmap: TDLBitmap; ColorFrom, ColorTo: TColor);
var
LScan: pRGBATriple;
i, j: integer;
begin
for i := 0 to aBitmap.Height - 1 do
begin
LScan := aBitmap.Scanline[i];
for j := 0 to ABitmap.Width - 1 do
begin
if (LScan[j].rgbtBlue = GetBColor(ColorFrom)) and
(LScan[j].rgbtGreen = GetGColor(ColorFrom)) and
(LScan[j].rgbtRed = GetRColor(ColorFrom)) then
begin
LScan[j].rgbtBlue := GetBColor(ColorTo);
LScan[j].rgbtGreen := GetGColor(ColorTo);
LScan[j].rgbtRed := GetRColor(ColorTo);
end;
end;
end;
aBitmap.InvalidateScanLine;
end;

View File

@@ -49,7 +49,7 @@
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<CursorPos X="14" Y="4"/> <CursorPos X="14" Y="4"/>
<UsageCount Value="73"/> <UsageCount Value="74"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
@@ -58,22 +58,23 @@
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<UnitName Value="Main"/> <UnitName Value="Main"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="0"/> <EditorIndex Value="0"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="10"/> <TopLine Value="1096"/>
<CursorPos X="72" Y="1197"/> <CursorPos X="25" Y="1112"/>
<UsageCount Value="73"/> <UsageCount Value="74"/>
<Loaded Value="True"/> <Loaded Value="True"/>
<LoadedDesigner Value="True"/> <LoadedDesigner Value="True"/>
</Unit1> </Unit1>
<Unit2> <Unit2>
<Filename Value="picturectrls.pas"/> <Filename Value="picturectrls.pas"/>
<UnitName Value="PictureCtrls"/> <UnitName Value="PictureCtrls"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="25"/> <TopLine Value="1165"/>
<CursorPos X="3" Y="44"/> <CursorPos X="42" Y="1176"/>
<UsageCount Value="31"/> <UsageCount Value="31"/>
<Loaded Value="True"/>
</Unit2> </Unit2>
<Unit3> <Unit3>
<Filename Value="preview.pas"/> <Filename Value="preview.pas"/>
@@ -175,7 +176,7 @@
<Unit13> <Unit13>
<Filename Value="picturemanager.pas"/> <Filename Value="picturemanager.pas"/>
<UnitName Value="PictureManager"/> <UnitName Value="PictureManager"/>
<EditorIndex Value="1"/> <EditorIndex Value="2"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<CursorPos X="95" Y="2"/> <CursorPos X="95" Y="2"/>
@@ -354,10 +355,11 @@
<Unit35> <Unit35>
<Filename Value="DLBitmap.pas"/> <Filename Value="DLBitmap.pas"/>
<UnitName Value="DLBitmap"/> <UnitName Value="DLBitmap"/>
<EditorIndex Value="2"/> <IsVisibleTab Value="True"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="506"/> <TopLine Value="110"/>
<CursorPos X="39" Y="520"/> <CursorPos X="1" Y="131"/>
<UsageCount Value="15"/> <UsageCount Value="15"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit35> </Unit35>
@@ -387,10 +389,10 @@
</Unit38> </Unit38>
<Unit39> <Unit39>
<Filename Value="DLBmpUtils.inc"/> <Filename Value="DLBmpUtils.inc"/>
<EditorIndex Value="3"/> <EditorIndex Value="4"/>
<WindowIndex Value="0"/> <WindowIndex Value="0"/>
<TopLine Value="483"/> <TopLine Value="593"/>
<CursorPos X="97" Y="5"/> <CursorPos X="50" Y="611"/>
<UsageCount Value="13"/> <UsageCount Value="13"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit39> </Unit39>
@@ -406,123 +408,123 @@
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="637" Column="13" TopLine="605"/> <Caret Line="1208" Column="28" TopLine="1194"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="644" Column="13" TopLine="612"/> <Caret Line="6" Column="87" TopLine="1"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="658" Column="13" TopLine="626"/> <Caret Line="100" Column="21" TopLine="68"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="665" Column="13" TopLine="633"/> <Caret Line="113" Column="17" TopLine="81"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="835" Column="13" TopLine="803"/> <Caret Line="133" Column="17" TopLine="101"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="842" Column="29" TopLine="806"/> <Caret Line="137" Column="21" TopLine="105"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="480" Column="28" TopLine="462"/> <Caret Line="177" Column="20" TopLine="145"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="842" Column="24" TopLine="823"/> <Caret Line="183" Column="16" TopLine="151"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="DLBitmap.pas"/> <Filename Value="main.pas"/>
<Caret Line="70" Column="91" TopLine="62"/> <Caret Line="257" Column="27" TopLine="225"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="DLBitmap.pas"/> <Filename Value="main.pas"/>
<Caret Line="448" Column="26" TopLine="434"/> <Caret Line="1197" Column="72" TopLine="10"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="DLBitmap.pas"/> <Filename Value="main.pas"/>
<Caret Line="82" Column="16" TopLine="63"/> <Caret Line="1198" Column="72" TopLine="1167"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="DLBitmap.pas"/> <Filename Value="main.pas"/>
<Caret Line="468" Column="3" TopLine="442"/> <Caret Line="1199" Column="72" TopLine="1168"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="6" Column="103" TopLine="25"/> <Caret Line="1198" Column="72" TopLine="1167"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="1195" Column="8" TopLine="1187"/> <Caret Line="1199" Column="72" TopLine="1168"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="316" Column="39" TopLine="297"/> <Caret Line="1201" Column="72" TopLine="1170"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="1196" Column="66" TopLine="1183"/> <Caret Line="1337" Column="3" TopLine="1329"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="DLBitmap.pas"/> <Filename Value="main.pas"/>
<Caret Line="556" Column="32" TopLine="530"/> <Caret Line="1344" Column="3" TopLine="1336"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="1208" Column="28" TopLine="1194"/> <Caret Line="1105" Column="26" TopLine="1096"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="main.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="1209" Column="28" TopLine="1195"/> <Caret Line="193" Column="57" TopLine="181"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="main.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="1208" Column="28" TopLine="1194"/> <Caret Line="510" Column="30" TopLine="506"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="main.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="1209" Column="28" TopLine="1195"/> <Caret Line="1176" Column="33" TopLine="1159"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="main.pas"/> <Filename Value="DLBitmap.pas"/>
<Caret Line="1208" Column="28" TopLine="1194"/> <Caret Line="428" Column="28" TopLine="409"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="main.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="6" Column="87" TopLine="1"/> <Caret Line="4" Column="96" TopLine="1"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="main.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="100" Column="21" TopLine="68"/> <Caret Line="601" Column="1" TopLine="588"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="main.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="113" Column="17" TopLine="81"/> <Caret Line="13" Column="89" TopLine="5"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="main.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="133" Column="17" TopLine="101"/> <Caret Line="615" Column="45" TopLine="591"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="main.pas"/> <Filename Value="DLBmpUtils.inc"/>
<Caret Line="137" Column="21" TopLine="105"/> <Caret Line="616" Column="59" TopLine="593"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="177" Column="20" TopLine="145"/> <Caret Line="1106" Column="31" TopLine="1096"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="main.pas"/> <Filename Value="main.pas"/>
<Caret Line="183" Column="16" TopLine="151"/> <Caret Line="1112" Column="25" TopLine="1096"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="main.pas"/> <Filename Value="picturectrls.pas"/>
<Caret Line="257" Column="27" TopLine="225"/> <Caret Line="188" Column="27" TopLine="172"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
</ProjectOptions> </ProjectOptions>

View File

@@ -1,7 +1,7 @@
object MainForm: TMainForm object MainForm: TMainForm
Left = 260 Left = 180
Height = 681 Height = 681
Top = 147 Top = 90
Width = 920 Width = 920
Caption = 'Lazarus Image Editor' Caption = 'Lazarus Image Editor'
ClientHeight = 659 ClientHeight = 659
@@ -1105,6 +1105,33 @@
OnClick = ToolMaskFloodFillClick OnClick = ToolMaskFloodFillClick
end end
end end
object BtnFromColor: TColorButton
Left = 421
Height = 25
Top = 4
Width = 43
BorderWidth = 2
ButtonColorSize = 16
ButtonColor = clBlack
end
object BtnToColor: TColorButton
Left = 488
Height = 25
Top = 4
Width = 43
BorderWidth = 2
ButtonColorSize = 16
ButtonColor = clBlack
OnClick = BtnToColorClick
end
object Label1: TLabel
Left = 469
Height = 20
Top = 5
Width = 14
Caption = 'to'
ParentColor = False
end
end end
object PanelToolOptions: TPanel object PanelToolOptions: TPanel
Left = 0 Left = 0
@@ -1348,9 +1375,9 @@
TabOrder = 5 TabOrder = 5
object checkFuzzy: TCheckBox object checkFuzzy: TCheckBox
Left = 4 Left = 4
Height = 19 Height = 23
Top = 9 Top = 5
Width = 20 Width = 24
OnChange = checkFuzzyChange OnChange = checkFuzzyChange
TabOrder = 0 TabOrder = 0
end end
@@ -2071,6 +2098,10 @@
Caption = 'Grayscale' Caption = 'Grayscale'
OnClick = ColorsGrayscaleExecute OnClick = ColorsGrayscaleExecute
end end
object MenuItem5: TMenuItem
Caption = 'Replace'
OnClick = MenuItem5Click
end
object MenuItemDisable: TMenuItem object MenuItemDisable: TMenuItem
Caption = 'Disable' Caption = 'Disable'
OnClick = ColorsDisableExecute OnClick = ColorsDisableExecute

File diff suppressed because it is too large Load Diff

View File

@@ -42,6 +42,8 @@ type
TMainForm = class(TForm) TMainForm = class(TForm)
ActionList: TActionList; ActionList: TActionList;
checkFuzzy: TCheckBox; checkFuzzy: TCheckBox;
BtnFromColor: TColorButton;
BtnToColor: TColorButton;
ColorsDisable: TAction; ColorsDisable: TAction;
ColorsGrayscale: TAction; ColorsGrayscale: TAction;
ColorsInvert: TAction; ColorsInvert: TAction;
@@ -61,10 +63,12 @@ type
FileSaveAs: TAction; FileSaveAs: TAction;
FlipHorizontally: TAction; FlipHorizontally: TAction;
FlipVertically: TAction; FlipVertically: TAction;
Label1: TLabel;
LabelTolerance1: TLabel; LabelTolerance1: TLabel;
LabelTolerance2: TLabel; LabelTolerance2: TLabel;
MaskInvert: TAction; MaskInvert: TAction;
MaskRemove: TAction; MaskRemove: TAction;
MenuItem5: TMenuItem;
Palette: TColorPalette; Palette: TColorPalette;
MenuItemShowGrid: TMenuItem; MenuItemShowGrid: TMenuItem;
Panel1: TPanel; Panel1: TPanel;
@@ -215,6 +219,7 @@ type
ViewShowGrid: TAction; ViewShowGrid: TAction;
ViewShowMask: TAction; ViewShowMask: TAction;
procedure checkFuzzyChange(Sender: TObject); procedure checkFuzzyChange(Sender: TObject);
procedure BtnToColorClick(Sender: TObject);
procedure ColorsDisableExecute(Sender: TObject); procedure ColorsDisableExecute(Sender: TObject);
procedure ColorsGrayscaleExecute(Sender: TObject); procedure ColorsGrayscaleExecute(Sender: TObject);
procedure ColorsInvertExecute(Sender: TObject); procedure ColorsInvertExecute(Sender: TObject);
@@ -245,6 +250,7 @@ type
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure MaskInvertExecute(Sender: TObject); procedure MaskInvertExecute(Sender: TObject);
procedure MaskRemoveExecute(Sender: TObject); procedure MaskRemoveExecute(Sender: TObject);
procedure MenuItem5Click(Sender: TObject);
procedure MenuItemAboutClick(Sender: TObject); procedure MenuItemAboutClick(Sender: TObject);
procedure MenuItemClipPaperToMaskClick(Sender: TObject); procedure MenuItemClipPaperToMaskClick(Sender: TObject);
procedure MenuItemExitClick(Sender: TObject); procedure MenuItemExitClick(Sender: TObject);
@@ -1099,6 +1105,13 @@ begin
ActivePictureEdit.RemoveMask; ActivePictureEdit.RemoveMask;
end; end;
procedure TMainForm.MenuItem5Click(Sender: TObject);
begin
if not Pictures.CanEdit then
Exit;
ActivePictureEdit.ColorReplace(BtnFromColor.ButtonColor, BtnToColor.ButtonColor);
end;
procedure TMainForm.MenuItemAboutClick(Sender: TObject); procedure TMainForm.MenuItemAboutClick(Sender: TObject);
begin begin
AboutDialogForm := TAboutDialogForm.Create(Self); AboutDialogForm := TAboutDialogForm.Create(Self);
@@ -1328,6 +1341,11 @@ begin
ActivePictureEdit.Fuzzy := checkFuzzy.Checked; ActivePictureEdit.Fuzzy := checkFuzzy.Checked;
end; end;
procedure TMainForm.BtnToColorClick(Sender: TObject);
begin
end;
procedure TMainForm.EditSizeChange(Sender: TObject); procedure TMainForm.EditSizeChange(Sender: TObject);
begin begin
if not Pictures.CanEdit then if not Pictures.CanEdit then

View File

@@ -185,6 +185,7 @@ type
procedure Rotate90Clockwise; procedure Rotate90Clockwise;
procedure Rotate180Clockwise; procedure Rotate180Clockwise;
procedure Rotate270Clockwise; procedure Rotate270Clockwise;
procedure ColorReplace(ColorFrom, ColorTo: TColor);
procedure StretchTruncate(AWidth, AHeight: integer); procedure StretchTruncate(AWidth, AHeight: integer);
procedure StretchSmooth(AWidth, AHeight: integer; Method: TSmoothMethod); procedure StretchSmooth(AWidth, AHeight: integer; Method: TSmoothMethod);
@@ -1172,6 +1173,19 @@ begin
UpdatePicture; UpdatePicture;
end; end;
procedure TCustomPictureEdit.ColorReplace(ColorFrom, ColorTo: TColor);
begin
if Picture = nil then
Exit;
BeginDraw;
try
Picture.ColorReplace(ColorFrom, ColorTo);
finally
EndDraw;
end;
UpdatePicture;
end;
procedure TCustomPictureEdit.StretchTruncate(AWidth, AHeight: integer); procedure TCustomPictureEdit.StretchTruncate(AWidth, AHeight: integer);
begin begin
if Picture = nil then if Picture = nil then