📄 previews.pas
字号:
end;
// Gamma Correction
if PageControl1.ActivePage = TabGamma then
begin
gamChannels := [];
if cbxGamma.checked[0] then
gamChannels := gamChannels + [iecRed];
if cbxGamma.checked[1] then
gamChannels := gamChannels + [iecGreen];
if cbxGamma.checked[2] then
gamChannels := gamChannels + [iecBlue];
im.Proc.GammaCorrect(trkGamma.position / 10, gamChannels);
end;
// Sharpen
if PageControl1.ActivePage = TabSheet14 then
begin
_Sharpen(im.IEBitmap, 0, 0, im.IEBitmap.Width, im.IEBitmap.Height, Sharpen, SharpenSize, v1, v2);
end;
//
UpdatePreviewZoom;
end;
procedure TfPreviews.UpdatePreviewZoom;
begin
// pages that disables the zoom
case PageControl1.ActivePage.tag of
1, 2, 3, 4, 5, 6, 10, 13, 14:
ImageEn1.MouseInteract := ImageEn1.MouseInteract + [miZoom];
else
begin
ImageEn1.MouseInteract := ImageEn1.MouseInteract - [miZoom];
ImageEn1.Fit;
end;
end;
end;
/////////////////////////////////////////////////////////////////////////////////////
// Copia zona originale in elaborata e applica l'effetto corrente
procedure TfPreviews.CopyOrg;
var
//tmpbitmap: TBitmap;
//iebmp: TIEBitmap;
ie:TImageEnView;
newwidth, newheight: integer;
xDst, yDst, dxDst, dyDst: integer;
xSrc, ySrc, dxSrc, dySrc: integer;
begin
ImageEn2.LockPaint;
(*
imageen2.IEBitmap.Width := imageen1.ExtentX;
imageen2.IEbitmap.Height := imageen1.ExtentY;
imageen1.DrawTo(imageen2.bitmap.canvas);
//*)
//(*
imageen2.IEBitmap.Width := imageen1.ExtentX;
imageen2.IEbitmap.Height := imageen1.ExtentY;
imageen1.GetRenderRectangles(xDst, yDst, dxDst, dyDst, xSrc, ySrc, dxSrc, dySrc);
imageen1.IEBitmap.StretchRectTo( imageen2.iebitmap, 0,0,imageen2.iebitmap.width,imageen2.iebitmap.height, xSrc,ySrc,dxSrc,dySrc,rfNone,255 );
imageen2.iebitmap.AlphaChannel.full:=imageen1.iebitmap.alphachannel.full;
imageen2.Update;
//*)
imageen2.Proc.SaveUndo(ieuImage);
// FFT
(*
if not assigned(FTImage) then
begin
FTImage := TIEFtImage.Create;
FTImage.OnProgress := ImageEnProc2.OnProgress;
end;
if imageen1.IEBitmap.Width > imageen1.IEBitmap.Height then
begin
newwidth := 128;
NewHeight := (imageen1.IEBitmap.Height * NewWidth) div imageen1.IEBitmap.Width;
end
else
begin
newheight := 128;
NewWidth := (imageen1.IEBitmap.Width * NewHeight) div imageen1.IEBitmap.Height;
end;
tmpbitmap := tbitmap.create;
tmpbitmap.pixelformat := pf24bit;
tmpbitmap.width := newwidth;
tmpbitmap.height := newheight;
SetStretchBltMode(tmpbitmap.canvas.handle, HALFTONE);
SetBrushOrgEx(tmpbitmap.canvas.handle, 0, 0, nil);
tmpbitmap.Canvas.StretchDraw(rect(0, 0, newwidth, newheight), ImageEn1.bitmap);
FFTProgressPos := 0;
iebmp := TIEBitmap.Create;
iebmp.EncapsulateTBitmap(tmpBitmap, true);
if checkbox1.checked then
FTImage.BuildFT(iebmp, ieitGRAYSCALE)
else
FTImage.BuildFT(iebmp, ieitRGB);
FreeAndNil(iebmp);
FreeAndNil(tmpbitmap);
ProgressBar1.Position := 0;
*)
if not assigned(FTImage) then
begin
FTImage := TIEFtImage.Create;
FTImage.OnProgress := ImageEnProc2.OnProgress;
end;
if imageen1.IEBitmap.Width > imageen1.IEBitmap.Height then
begin
newwidth := 128;
NewHeight := (imageen1.IEBitmap.Height * NewWidth) div imageen1.IEBitmap.Width;
end
else
begin
newheight := 128;
NewWidth := (imageen1.IEBitmap.Width * NewHeight) div imageen1.IEBitmap.Height;
end;
ie:=TImageEnView.Create(nil);
ie.LegacyBitmap:=False;
ImageEn1.Proc.ResampleTo(ie.IEBitmap,newwidth,newheight,rfTriangle);
FFTProgressPos := 0;
if checkbox1.checked then
FTImage.BuildFT(ie.IEBitmap, ieitGRAYSCALE)
else
FTImage.BuildFT(ie.IEBitmap, ieitRGB);
ProgressBar1.Position := 0;
ie.free;
//
ApplyAct(imageen2);
ImageEn2.UnLockPaint;
if PageControl1.ActivePage = TabSheet6 then
HistogramBox1.Update;
end;
/////////////////////////////////////////////////////////////////////////////////////
// Copia immagine modificata in originale (applica effetto corrente a imageen1)
procedure TfPreviews.CopyModToOrg;
begin
ApplyAct(imageen1);
imageen1.update;
imageen1.paint; // <- needed
CopyOrg;
end;
/////////////////////////////////////////////////////////////////////////////////////
// variazione HSL (trackbars 2/3/5)
procedure TfPreviews.TrackBar2Change(Sender: TObject);
begin
if not dochange then
exit;
if (Hue <> trackbar2.position) or (Sat <> trackbar3.position) or (Lum <> trackbar5.position) then
begin
Hue := trackbar2.position;
Sat := trackbar3.position;
Lum := trackbar5.position;
edit4.text := inttostr(Hue);
edit2.text := inttostr(Sat);
edit3.text := inttostr(Lum);
if chkLockPreview.checked then
begin
imageen2.Proc.undo;
ApplyAct(imageen2);
imageen2.paint;
end;
end;
end;
/////////////////////////////////////////////////////////////////////////////////////
// variazione HSL (edits 4/2/3)
procedure TfPreviews.Edit4Change(Sender: TObject);
var
h, s, l: integer;
begin
if not dochange then
exit;
h := strtointdef(edit4.text, 0);
s := strtointdef(edit2.text, 0);
l := strtointdef(edit3.text, 0);
if (Hue <> h) or (Sat <> s) or (Lum <> l) then
begin
trackbar2.position := h;
trackbar3.position := s;
trackbar5.position := l;
trackbar2change(self);
end;
end;
/////////////////////////////////////////////////////////////////////////////////////
// cambia tipo effetto (pagecontrol1)
procedure TfPreviews.PageControl1Change(Sender: TObject);
begin
ResetParameters(false);
UpdatePreviewZoom;
CopyOrg;
end;
/////////////////////////////////////////////////////////////////////////////////////
// Copia immagine modificata in originale (applica effetto corrente a imageen1)
procedure TfPreviews.Button6Click(Sender: TObject);
begin
CopyModToOrg;
ResetParameters(true);
CopyOrg;
UndoCaption:=UndoCaption+undos[PageControl1.ActivePage.tag-1]+',';
end;
/////////////////////////////////////////////////////////////////////////////////////
// cambia zoom/view di imageen1 (immagine originale)
procedure TfPreviews.ImageEn1ViewChange(Sender: TObject; Change: Integer);
begin
// if (Change=0) and imageen1.MouseCapture then
// exit; // movimento in corso
CopyOrg;
end;
/////////////////////////////////////////////////////////////////////////////////////
// variazione RGB (trackbars6/7/8)
procedure TfPreviews.TrackBar6Change(Sender: TObject);
begin
if not dochange then
exit;
if (red <> trackbar6.position) or (green <> trackbar7.position) or (blue <> trackbar8.position) then
begin
red := trackbar6.position;
green := trackbar7.position;
blue := trackbar8.position;
edit7.text := inttostr(red);
edit6.text := inttostr(green);
edit5.text := inttostr(blue);
if chkLockPreview.checked then
begin
imageen2.Proc.undo;
ApplyAct(imageen2);
imageen2.paint;
end;
end;
end;
/////////////////////////////////////////////////////////////////////////////////////
// variazione RGB (edit7-6-5)
procedure TfPreviews.Edit7Change(Sender: TObject);
var
rr, gg, bb: integer;
begin
if not dochange then
exit;
rr := strtointdef(edit7.text, 0);
gg := strtointdef(edit6.text, 0);
bb := strtointdef(edit5.text, 0);
if (red <> rr) or (green <> gg) or (blue <> bb) then
begin
trackbar6.position := rr;
trackbar7.position := gg;
trackbar8.position := bb;
trackbar6change(self);
end;
end;
/////////////////////////////////////////////////////////////////////////////////////
// variazione valori filtro (edit8...16)
procedure TfPreviews.Edit8Change(Sender: TObject);
begin
if domod then
begin
filter.Divisor := strtointdef(edit20.text, 1);
with TEdit(sender) do
filter.Values[(tag div 3), tag - (tag div 3) * 3] := strtointdef(text, 0);
if chkLockPreview.checked then
begin
imageen2.Proc.undo;
ApplyAct(imageen2);
imageen2.paint;
end;
end;
end;
/////////////////////////////////////////////////////////////////////////////////////
// Selezione valore nel list box - valori presettati filtri
procedure TfPreviews.ListBox1Click(Sender: TObject);
begin
if not dochange then
exit;
filter := IEGetFilter( listbox1.itemindex )^;
LoadFilt;
if chkLockPreview.checked then
begin
imageen2.Proc.undo;
ApplyAct(imageen2);
imageen2.paint;
end;
end;
/////////////////////////////////////////////////////////////////////////////////////
procedure TfPreviews.LoadFilt;
begin
domod := false;
edit8.text := inttostr(filter.Values[0, 0]);
edit9.text := inttostr(filter.Values[1, 0]);
edit10.text := inttostr(filter.Values[2, 0]);
edit11.text := inttostr(filter.Values[0, 1]);
edit12.text := inttostr(filter.Values[1, 1]);
edit13.text := inttostr(filter.Values[2, 1]);
edit14.text := inttostr(filter.Values[0, 2]);
edit15.text := inttostr(filter.Values[1, 2]);
edit16.text := inttostr(filter.Values[2, 2]);
edit20.text := inttostr(filter.divisor);
domod := true;
end;
/////////////////////////////////////////////////////////////////////////////////////
// Rende effettivo l'effetto corrente e chiude (implicito)
procedure TfPreviews.Button1Click(Sender: TObject);
begin
DoProgress := true;
ApplyAct(imageen1);
imageen1.update;
UndoCaption:=UndoCaption+undos[PageControl1.ActivePage.tag-1];
GetIPParams;
DefaultLockPreview:=chkLockPreview.checked;
end;
/////////////////////////////////////////////////////////////////////////////////////
// load filter
procedure TfPreviews.Button4Click(Sender: TObject);
begin
if OpenDialog1.execute then
begin
filter := LoadFilterFromFile(OpenDialog1.filename);
LoadFilt;
if chkLockPreview.checked then
begin
imageen2.Proc.undo;
ApplyAct(imageen2);
imageen2.paint;
end;
end;
end;
/////////////////////////////////////////////////////////////////////////////////////
// save filter
procedure TfPreviews.Button5Click(Sender: TObject);
begin
if SaveDialog1.execute then
SaveFilterToFile(SaveDialog1.filename, Filter);
end;
/////////////////////////////////////////////////////////////////////////////////////
// Channels
procedure TfPreviews.CheckListBox1Click(Sender: TObject);
begin
if not dochange then
exit;
HistogramBox1.HistogramKind := [];
if CheckListBox1.Checked[0] then
HistogramBox1.HistogramKind := HistogramBox1.HistogramKind + [hkRed];
if CheckListBox1.Checked[1] then
HistogramBox1.HistogramKind := HistogramBox1.HistogramKind + [hkGreen];
if CheckListBox1.Checked[2] then
HistogramBox1.HistogramKind := HistogramBox1.HistogramKind + [hkBlue];
if CheckListBox1.Checked[3] then
HistogramBox1.HistogramKind := HistogramBox1.HistogramKind + [hkGray];
RulerBox1.Left := HistogramBox1.HistogramXPos;
RulerBox1.Width := HistogramBox1.Width - RulerBox1.Left;
end;
/////////////////////////////////////////////////////////////////////////////////////
// Cambia posizione RulerBox1
procedure TfPreviews.RulerBox1RulerPosChange(Sender: TObject;
Grip: Integer);
begin
if not dochange then
exit;
// Aggiorna labels
if RulerBox1.GripsPos[0] > RulerBox1.GripsPos[1] then
if Grip = 0 then
RulerBox1[1] := RulerBox1[0]
else
RulerBox1[0] := RulerBox1[1];
if Grip = 0 then
Label16.Caption := inttostr(trunc(RulerBox1.GripsPos[0]))
else if Grip = 1 then
Label17.Caption := inttostr(trunc(RulerBox1.GripsPos[1]));
//
if (CheckListBox1.Checked[0]) or (CheckListBox1.Checked[3]) then
begin
// RED
DownLimit.r := trunc(RulerBox1.GripsPos[0]);
UpLimit.r := trunc(RulerBox1.GripsPos[1]);
end;
if (CheckListBox1.Checked[1]) or (CheckListBox1.Checked[3]) then
begin
// GREEN
DownLimit.g := trunc(RulerBox1.GripsPos[0]);
UpLimit.g := trunc(RulerBox1.GripsPos[1]);
end;
if (CheckListBox1.Checked[2]) or (CheckListBox1.Checked[3]) then
begin
// BLUE
DownLimit.b := trunc(RulerBox1.GripsPos[0]);
UpLimit.b := trunc(RulerBox1.GripsPos[1]);
end;
if chkLockPreview.checked then
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -