MainUnit.pas 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. unit MainUnit;
  2. interface
  3. uses
  4. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  5. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Samples.Spin, Vcl.ExtCtrls,
  6. GR32,
  7. GR32_Image,
  8. GR32_OrdinalMaps;
  9. type
  10. TFormMain = class(TForm)
  11. PanelSource: TPanel;
  12. ImgViewSource: TImgView32;
  13. Panel2: TPanel;
  14. PanelOptions: TPanel;
  15. PanelResult: TPanel;
  16. ImgViewResult: TImgView32;
  17. Panel5: TPanel;
  18. PanelImages: TPanel;
  19. Splitter1: TSplitter;
  20. Label1: TLabel;
  21. SpinEditValue: TSpinEdit;
  22. ButtonApply: TButton;
  23. procedure FormCreate(Sender: TObject);
  24. procedure ButtonApplyClick(Sender: TObject);
  25. procedure FormDestroy(Sender: TObject);
  26. private
  27. FKernel: TIntegerMap;
  28. public
  29. end;
  30. var
  31. FormMain: TFormMain;
  32. implementation
  33. {$R *.dfm}
  34. uses
  35. GR32_Resamplers;
  36. procedure TFormMain.FormCreate(Sender: TObject);
  37. begin
  38. ImgViewSource.Bitmap.LoadFromResourceName(hInstance, 'DICE', 'PNG');
  39. ImgViewSource.Bitmap.ResamplerClassName := TLinearResampler.ClassName;
  40. FKernel := TIntegerMap.Create;
  41. FKernel.SetSize(3, 3);
  42. end;
  43. procedure TFormMain.FormDestroy(Sender: TObject);
  44. begin
  45. FKernel.Free;
  46. end;
  47. procedure TFormMain.ButtonApplyClick(Sender: TObject);
  48. var
  49. Value: integer;
  50. z: integer;
  51. NormalizationFactor: Double;
  52. Norm_z: integer;
  53. Norm_zz: integer;
  54. Norm_One: integer;
  55. begin
  56. Screen.Cursor := crHourGlass;
  57. try
  58. Value := SpinEditValue.Value;
  59. if (Value = 0) then
  60. begin
  61. // Nothing to do; Just copy the bitmap
  62. // Assign() also copies the properties...
  63. ImgViewResult.Bitmap.Assign(ImgViewSource.Bitmap);
  64. // ...so we'll need to restore some of them
  65. ImgViewResult.Bitmap.ResamplerClassName := TNearestResampler.ClassName;
  66. exit;
  67. end;
  68. // Note: Kernel is using 24:8 fixed precision numbers
  69. if (Value < 0) then
  70. begin
  71. z := 6 + Value;
  72. // Normalization: 1/<sum>
  73. NormalizationFactor := 1 / (z*4 + 4 + z*z);
  74. // Normalize values and scale
  75. Norm_One := Round(NormalizationFactor * 256);
  76. Norm_z := Round(z * NormalizationFactor * 256);
  77. Norm_zz := Round(z*z * NormalizationFactor * 256);
  78. FKernel.Value[0, 0] := Norm_One; FKernel.Value[1, 0] := Norm_z; FKernel.Value[2, 0] := Norm_One;
  79. FKernel.Value[0, 1] := Norm_z; FKernel.Value[1, 1] := Norm_zz; FKernel.Value[2, 1] := Norm_z;
  80. FKernel.Value[0, 2] := Norm_One; FKernel.Value[1, 2] := Norm_z; FKernel.Value[2, 2] := Norm_One;
  81. end else
  82. begin
  83. // Sharpen
  84. z := 22 - Value * 2;
  85. // Normalization: 1/<sum>
  86. NormalizationFactor := 1 / (z - 8);
  87. // Normalize values and scale
  88. Norm_One := -Round(NormalizationFactor * 256);
  89. Norm_z := Round(z * NormalizationFactor * 256);
  90. FKernel.Value[0, 0] := Norm_One; FKernel.Value[1, 0] := Norm_One; FKernel.Value[2, 0] := Norm_One;
  91. FKernel.Value[0, 1] := Norm_One; FKernel.Value[1, 1] := Norm_z; FKernel.Value[2, 1] := Norm_One;
  92. FKernel.Value[0, 2] := Norm_One; FKernel.Value[1, 2] := Norm_One; FKernel.Value[2, 2] := Norm_One;
  93. end;
  94. Convolve(ImgViewSource.Bitmap, ImgViewResult.Bitmap, FKernel, 1, 1);
  95. finally
  96. Screen.Cursor := crDefault;
  97. end;
  98. end;
  99. end.