mainunit.pas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. {
  2. Vampyre Imaging Library Demo
  3. LCL Imager (ObjectPascal, high level/component sets/canvas, Win32/Linux/BSD)
  4. tested in Lazarus 0.9.24
  5. written by Marek Mauder
  6. Simple image manipulator program which shows usage of Imaging VCL/CLX/LCL
  7. classes (TImagingGraphic and its descendants) to display images on form.
  8. It also uses high level image classes and some low level functions.
  9. Demo uses TMultiImage class to store images (loaded from one file - MNG, DDS)
  10. which can be modified by user. After each modification image
  11. is assigned to TImagingBitmap class which provides visualization
  12. on the app form (using standard TImage component). Demo also uses new
  13. TImagingCanvas class to do some effects.
  14. In File menu you can open new image and save the current one. Items in
  15. View menu provide information about the current image and controls
  16. how it is displayed. You can also select next and previous subimage if loaded file
  17. contains more than one image. Format menu allows you to convert image
  18. to different image data formats supported by Imaging. Manipulate
  19. menu allows you to enlarge/shrink/flip/mirror/swap channels/other
  20. of the current image. Effects menu allows you to apply various effects to the
  21. image (provided by TImagingCanvas).
  22. }
  23. unit MainUnit;
  24. {$I ImagingOptions.inc}
  25. interface
  26. uses
  27. Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
  28. Menus, ExtCtrls, ExtDlgs, DemoUtils, AboutUnit, ActnList,
  29. ImagingTypes,
  30. Imaging,
  31. ImagingClasses,
  32. ImagingComponents,
  33. ImagingCanvases,
  34. ImagingUtility;
  35. type
  36. TManipulationType = (mtFlip, mtMirror, mtRotate90CW, mtRotate90CCW,
  37. mtResize50Nearest, mtResize50Linear, mtResize50Cubic,
  38. mtResize200Nearest, mtResize200Linear, mtResize200Cubic,
  39. mtSwapRB, mtSwapRG, mtSwapGB, mtReduce1024,
  40. mtReduce256, mtReduce64, mtReduce16, mtReduce2);
  41. { TMainForm }
  42. TMainForm = class(TForm)
  43. ActViewInfo: TAction;
  44. ActViewFitToWindow: TAction;
  45. ActViewRealSize: TAction;
  46. ActionList1: TActionList;
  47. Image: TImage;
  48. MainMenu: TMainMenu;
  49. MenuItem1: TMenuItem;
  50. MenuItem10: TMenuItem;
  51. MenuItem11: TMenuItem;
  52. MenuItem12: TMenuItem;
  53. MenuItem13: TMenuItem;
  54. MenuItem14: TMenuItem;
  55. MenuItem15: TMenuItem;
  56. MenuItem16: TMenuItem;
  57. MenuItem17: TMenuItem;
  58. FormatItem: TMenuItem;
  59. MenuItem18: TMenuItem;
  60. MenuItem19: TMenuItem;
  61. MenuItem2: TMenuItem;
  62. MenuItem20: TMenuItem;
  63. MenuItem21: TMenuItem;
  64. MenuItem22: TMenuItem;
  65. MenuItem23: TMenuItem;
  66. MenuItem24: TMenuItem;
  67. MenuItem25: TMenuItem;
  68. MenuItem26: TMenuItem;
  69. MenuItem27: TMenuItem;
  70. MenuItem28: TMenuItem;
  71. MenuItem29: TMenuItem;
  72. MenuItem3: TMenuItem;
  73. MenuItem30: TMenuItem;
  74. MenuItem31: TMenuItem;
  75. MenuItem32: TMenuItem;
  76. MenuItem33: TMenuItem;
  77. MenuItem36: TMenuItem;
  78. MenuItem37: TMenuItem;
  79. MenuItem38: TMenuItem;
  80. MenuItem39: TMenuItem;
  81. MenuItem40: TMenuItem;
  82. MenuItem41: TMenuItem;
  83. MenuItem42: TMenuItem;
  84. MenuItem43: TMenuItem;
  85. MenuItem44: TMenuItem;
  86. MenuItem45: TMenuItem;
  87. MenuItem46: TMenuItem;
  88. MenuItem47: TMenuItem;
  89. MenuItem48: TMenuItem;
  90. MenuItem49: TMenuItem;
  91. MenuItem50: TMenuItem;
  92. MenuItem51: TMenuItem;
  93. MenuItem52: TMenuItem;
  94. MenuItem53: TMenuItem;
  95. MenuItem54: TMenuItem;
  96. MenuItemActSubImage: TMenuItem;
  97. MenuItem34: TMenuItem;
  98. MenuItem35: TMenuItem;
  99. MenuItem4: TMenuItem;
  100. MenuItem5: TMenuItem;
  101. MenuItem6: TMenuItem;
  102. MenuItem7: TMenuItem;
  103. MenuItem8: TMenuItem;
  104. MenuItem9: TMenuItem;
  105. OpenD: TOpenPictureDialog;
  106. PanelStatus: TPanel;
  107. SaveD: TSavePictureDialog;
  108. procedure ActViewFitToWindowExecute(Sender: TObject);
  109. procedure ActViewInfoExecute(Sender: TObject);
  110. procedure ActViewRealSizeExecute(Sender: TObject);
  111. procedure FormCreate(Sender: TObject);
  112. procedure FormDestroy(Sender: TObject);
  113. procedure ImageClick(Sender: TObject);
  114. procedure MenuItem10Click(Sender: TObject);
  115. procedure MenuItem12Click(Sender: TObject);
  116. procedure MenuItem13Click(Sender: TObject);
  117. procedure MenuItem14Click(Sender: TObject);
  118. procedure MenuItem15Click(Sender: TObject);
  119. procedure MenuItem18Click(Sender: TObject);
  120. procedure MenuItem19Click(Sender: TObject);
  121. procedure MenuItem20Click(Sender: TObject);
  122. procedure MenuItem23Click(Sender: TObject);
  123. procedure MenuItem24Click(Sender: TObject);
  124. procedure MenuItem26Click(Sender: TObject);
  125. procedure MenuItem27Click(Sender: TObject);
  126. procedure MenuItem28Click(Sender: TObject);
  127. procedure MenuItem29Click(Sender: TObject);
  128. procedure MenuItem2Click(Sender: TObject);
  129. procedure MenuItem30Click(Sender: TObject);
  130. procedure MenuItem31Click(Sender: TObject);
  131. procedure MenuItem33Click(Sender: TObject);
  132. procedure MenuItem34Click(Sender: TObject);
  133. procedure MenuItem35Click(Sender: TObject);
  134. procedure MenuItem37Click(Sender: TObject);
  135. procedure MenuItem38Click(Sender: TObject);
  136. procedure MenuItem39Click(Sender: TObject);
  137. procedure MenuItem3Click(Sender: TObject);
  138. procedure MenuItem40Click(Sender: TObject);
  139. procedure MenuItem41Click(Sender: TObject);
  140. procedure MenuItem42Click(Sender: TObject);
  141. procedure MenuItem43Click(Sender: TObject);
  142. procedure MenuItem44Click(Sender: TObject);
  143. procedure MenuItem45Click(Sender: TObject);
  144. procedure MenuItem46Click(Sender: TObject);
  145. procedure MenuItem47Click(Sender: TObject);
  146. procedure MenuItem48Click(Sender: TObject);
  147. procedure MenuItem4Click(Sender: TObject);
  148. procedure MenuItem50Click(Sender: TObject);
  149. procedure MenuItem51Click(Sender: TObject);
  150. procedure MenuItem53Click(Sender: TObject);
  151. procedure MenuItem54Click(Sender: TObject);
  152. procedure MenuItem5Click(Sender: TObject);
  153. procedure MenuItem7Click(Sender: TObject);
  154. procedure FormatChangeClick(Sender: TObject);
  155. private
  156. FBitmap: TImagingBitmap;
  157. FImage: TMultiImage;
  158. FImageCanvas: TImagingCanvas;
  159. FFileName: string;
  160. procedure OpenFile(const FileName: string);
  161. procedure SaveFile(const FileName: string);
  162. procedure SelectSubimage(Index: LongInt);
  163. procedure UpdateView;
  164. function CheckCanvasFormat: Boolean;
  165. procedure ApplyConvolution(Kernel: Pointer; Size: LongInt; NeedsBlur: Boolean);
  166. procedure ApplyManipulation(ManipType: TManipulationType);
  167. procedure MeasureTime(const Msg: string; const OldTime: Int64);
  168. public
  169. end;
  170. const
  171. SWindowTitle = 'LCL Imager - Vampyre Imaging Library %s Demo';
  172. var
  173. MainForm: TMainForm;
  174. implementation
  175. { TMainForm }
  176. procedure TMainForm.MenuItem10Click(Sender: TObject);
  177. begin
  178. AboutForm.ShowModal;
  179. end;
  180. procedure TMainForm.MenuItem12Click(Sender: TObject);
  181. begin
  182. ApplyManipulation(mtSwapRB);
  183. end;
  184. procedure TMainForm.MenuItem13Click(Sender: TObject);
  185. begin
  186. ApplyManipulation(mtSwapRG);
  187. end;
  188. procedure TMainForm.MenuItem14Click(Sender: TObject);
  189. begin
  190. ApplyManipulation(mtSwapGB);
  191. end;
  192. procedure TMainForm.MenuItem15Click(Sender: TObject);
  193. begin
  194. ApplyManipulation(mtReduce1024);
  195. end;
  196. procedure TMainForm.MenuItem18Click(Sender: TObject);
  197. begin
  198. ApplyManipulation(mtReduce256);
  199. end;
  200. procedure TMainForm.MenuItem19Click(Sender: TObject);
  201. begin
  202. ApplyManipulation(mtReduce64);
  203. end;
  204. procedure TMainForm.MenuItem20Click(Sender: TObject);
  205. begin
  206. ApplyManipulation(mtReduce16);
  207. end;
  208. procedure TMainForm.MenuItem4Click(Sender: TObject);
  209. begin
  210. ApplyManipulation(mtMirror);
  211. end;
  212. procedure TMainForm.MenuItem23Click(Sender: TObject);
  213. begin
  214. ApplyManipulation(mtRotate90CW);
  215. end;
  216. procedure TMainForm.MenuItem24Click(Sender: TObject);
  217. begin
  218. ApplyManipulation(mtRotate90CCW);
  219. end;
  220. procedure TMainForm.MenuItem26Click(Sender: TObject);
  221. begin
  222. ApplyManipulation(mtResize50Nearest);
  223. end;
  224. procedure TMainForm.MenuItem27Click(Sender: TObject);
  225. begin
  226. ApplyManipulation(mtResize50Linear);
  227. end;
  228. procedure TMainForm.MenuItem28Click(Sender: TObject);
  229. begin
  230. ApplyManipulation(mtResize50Cubic);
  231. end;
  232. procedure TMainForm.MenuItem29Click(Sender: TObject);
  233. begin
  234. ApplyManipulation(mtResize200Nearest);
  235. end;
  236. procedure TMainForm.MenuItem2Click(Sender: TObject);
  237. begin
  238. ApplyManipulation(mtFlip);
  239. end;
  240. procedure TMainForm.MenuItem30Click(Sender: TObject);
  241. begin
  242. ApplyManipulation(mtResize200Linear);
  243. end;
  244. procedure TMainForm.MenuItem31Click(Sender: TObject);
  245. begin
  246. ApplyManipulation(mtResize200Cubic);
  247. end;
  248. procedure TMainForm.MenuItem33Click(Sender: TObject);
  249. begin
  250. ApplyManipulation(mtReduce2);
  251. end;
  252. procedure TMainForm.MenuItem37Click(Sender: TObject);
  253. begin
  254. ApplyConvolution(@FilterGaussian3x3, 3, False);
  255. end;
  256. procedure TMainForm.MenuItem38Click(Sender: TObject);
  257. begin
  258. ApplyConvolution(@FilterGaussian5x5, 5, False);
  259. end;
  260. procedure TMainForm.MenuItem39Click(Sender: TObject);
  261. begin
  262. ApplyConvolution(@FilterSharpen3x3, 3, False);
  263. end;
  264. procedure TMainForm.MenuItem40Click(Sender: TObject);
  265. begin
  266. ApplyConvolution(@FilterSharpen5x5, 5, False);
  267. end;
  268. procedure TMainForm.MenuItem41Click(Sender: TObject);
  269. begin
  270. ApplyConvolution(@FilterLaplace5x5, 5, True);
  271. end;
  272. procedure TMainForm.MenuItem42Click(Sender: TObject);
  273. begin
  274. ApplyConvolution(@FilterSobelHorz3x3, 3, True);
  275. end;
  276. procedure TMainForm.MenuItem43Click(Sender: TObject);
  277. begin
  278. ApplyConvolution(@FilterSobelVert3x3, 3, True);
  279. end;
  280. procedure TMainForm.MenuItem44Click(Sender: TObject);
  281. begin
  282. OpenFile(FFileName);
  283. end;
  284. procedure TMainForm.MenuItem45Click(Sender: TObject);
  285. begin
  286. ApplyConvolution(@FilterGlow5x5, 5, False);
  287. end;
  288. procedure TMainForm.MenuItem46Click(Sender: TObject);
  289. begin
  290. ApplyConvolution(@FilterEmboss3x3, 3, True);
  291. end;
  292. procedure TMainForm.MenuItem47Click(Sender: TObject);
  293. begin
  294. ApplyConvolution(@FilterNegative3x3, 3, False);
  295. end;
  296. procedure TMainForm.MenuItem48Click(Sender: TObject);
  297. begin
  298. ApplyConvolution(@FilterEdgeEnhance3x3, 3, False);
  299. end;
  300. procedure TMainForm.MenuItem50Click(Sender: TObject);
  301. begin
  302. ApplyConvolution(@FilterPrewittHorz3x3, 3, True);
  303. end;
  304. procedure TMainForm.MenuItem51Click(Sender: TObject);
  305. begin
  306. ApplyConvolution(@FilterKirshHorz3x3, 3, True);
  307. end;
  308. procedure TMainForm.MenuItem53Click(Sender: TObject);
  309. begin
  310. ApplyConvolution(@FilterPrewittVert3x3, 3, True);
  311. end;
  312. procedure TMainForm.MenuItem54Click(Sender: TObject);
  313. begin
  314. ApplyConvolution(@FilterKirshVert3x3, 3, True);
  315. end;
  316. procedure TMainForm.MenuItem34Click(Sender: TObject);
  317. begin
  318. SelectSubimage(FImage.ActiveImage + 1);
  319. end;
  320. procedure TMainForm.MenuItem35Click(Sender: TObject);
  321. begin
  322. SelectSubimage(FImage.ActiveImage - 1);
  323. end;
  324. function TMainForm.CheckCanvasFormat: Boolean;
  325. begin
  326. Result := FImage.Format in FImageCanvas.GetSupportedFormats;
  327. if not Result then
  328. MessageDlg('Image is in format that is not supported by TImagingCanvas.', mtError, [mbOK], 0);
  329. end;
  330. procedure TMainForm.ApplyConvolution(Kernel: Pointer; Size: LongInt; NeedsBlur: Boolean);
  331. var
  332. T: Int64;
  333. begin
  334. if CheckCanvasFormat then
  335. begin
  336. FImageCanvas.CreateForImage(FImage);
  337. T := GetTimeMicroseconds;
  338. if NeedsBlur then
  339. FImageCanvas.ApplyConvolution3x3(FilterGaussian3x3);
  340. if Size = 3 then
  341. FImageCanvas.ApplyConvolution3x3(TConvolutionFilter3x3(Kernel^))
  342. else
  343. FImageCanvas.ApplyConvolution5x5(TConvolutionFilter5x5(Kernel^));
  344. MeasureTime('Image convolved in:', T);
  345. UpdateView;
  346. end;
  347. end;
  348. procedure TMainForm.ApplyManipulation(ManipType: TManipulationType);
  349. var
  350. T: Int64;
  351. begin
  352. T := GetTimeMicroseconds;
  353. case ManipType of
  354. mtFlip: FImage.Flip;
  355. mtMirror: FImage.Mirror;
  356. mtRotate90CW: FImage.Rotate(-90);
  357. mtRotate90CCW: FImage.Rotate(90);
  358. mtResize50Nearest: FImage.Resize(FImage.Width div 2, FImage.Height div 2, rfNearest);
  359. mtResize50Linear: FImage.Resize(FImage.Width div 2, FImage.Height div 2, rfBilinear);
  360. mtResize50Cubic: FImage.Resize(FImage.Width div 2, FImage.Height div 2, rfBicubic);
  361. mtResize200Nearest: FImage.Resize(FImage.Width * 2, FImage.Height * 2, rfNearest);
  362. mtResize200Linear: FImage.Resize(FImage.Width * 2, FImage.Height * 2, rfBilinear);
  363. mtResize200Cubic: FImage.Resize(FImage.Width * 2, FImage.Height * 2, rfBicubic);
  364. mtSwapRB: FImage.SwapChannels(ChannelRed, ChannelBlue);
  365. mtSwapRG: FImage.SwapChannels(ChannelRed, ChannelGreen);
  366. mtSwapGB: FImage.SwapChannels(ChannelGreen, ChannelBlue);
  367. mtReduce1024: ReduceColors(FImage.ImageDataPointer^, 1024);
  368. mtReduce256: ReduceColors(FImage.ImageDataPointer^, 256);
  369. mtReduce64: ReduceColors(FImage.ImageDataPointer^, 64);
  370. mtReduce16: ReduceColors(FImage.ImageDataPointer^, 16);
  371. mtReduce2: ReduceColors(FImage.ImageDataPointer^, 2);
  372. end;
  373. MeasureTime('Image manipulated in:', T);
  374. UpdateView;
  375. end;
  376. procedure TMainForm.FormCreate(Sender: TObject);
  377. var
  378. Item: TMenuItem;
  379. Fmt: TImageFormat;
  380. Info: TImageFormatInfo;
  381. begin
  382. Caption := Format(SWindowTitle, [Imaging.GetVersionStr]);
  383. { Source image and Image's graphic are created and
  384. default image is opened.}
  385. FImage := TMultiImage.Create;
  386. FBitmap := TImagingBitmap.Create;
  387. Image.Picture.Graphic := FBitmap;
  388. FImageCanvas := TImagingCanvas.Create;
  389. { This builds Format submenu containing all possible
  390. image data formats (it dos not start at Low(TImageFormat)
  391. because there are some helper formats). Format for each item
  392. is stored in its Tag for later use in OnClick event.}
  393. for Fmt := ifIndex8 to High(TImageFormat) do
  394. begin
  395. GetImageFormatInfo(Fmt, Info);
  396. if Info.Name <> '' then
  397. begin
  398. Item := TMenuItem.Create(MainMenu);
  399. Item.Caption := Info.Name;
  400. Item.Tag := Ord(Fmt);
  401. Item.OnClick := FormatChangeClick;
  402. FormatItem.Add(Item);
  403. end;
  404. end;
  405. // Set 'Fit to window' mode
  406. ActViewFitToWindowExecute(Self);
  407. if (ParamCount > 0) and FileExists(ParamStr(1)) then
  408. OpenFile(ParamStr(1))
  409. else
  410. OpenFile(GetDataDir + PathDelim + 'Tigers.jpg');
  411. end;
  412. procedure TMainForm.FormatChangeClick(Sender: TObject);
  413. var
  414. T: Int64;
  415. begin
  416. with Sender as TMenuItem do
  417. begin
  418. T := GetTimeMicroseconds;
  419. FImage.Format := TImageFormat(Tag);
  420. MeasureTime('Image converted in:', T);
  421. UpdateView;
  422. end;
  423. end;
  424. procedure TMainForm.ActViewRealSizeExecute(Sender: TObject);
  425. begin
  426. ActViewRealSize.Checked := True;
  427. ActViewFitToWindow.Checked := False;
  428. Image.Proportional := False;
  429. Image.Stretch := False;
  430. end;
  431. procedure TMainForm.ActViewFitToWindowExecute(Sender: TObject);
  432. begin
  433. ActViewFitToWindow.Checked := True;
  434. ActViewRealSize.Checked := False;
  435. Image.Proportional := True;
  436. Image.Stretch := True;
  437. end;
  438. procedure TMainForm.ActViewInfoExecute(Sender: TObject);
  439. begin
  440. MessageDlg('Image Info: ' + ImageToStr(FImage.ImageDataPointer^), mtInformation, [mbOK], 0);
  441. end;
  442. procedure TMainForm.FormDestroy(Sender: TObject);
  443. begin
  444. FImageCanvas.Free;
  445. FBitmap.Free;
  446. FImage.Free;
  447. end;
  448. procedure TMainForm.ImageClick(Sender: TObject);
  449. begin
  450. ActViewInfo.Execute;
  451. end;
  452. procedure TMainForm.MenuItem3Click(Sender: TObject);
  453. begin
  454. OpenD.Filter := GetImageFileFormatsFilter(True);
  455. if OpenD.Execute then
  456. OpenFile(OpenD.FileName);
  457. end;
  458. procedure TMainForm.MenuItem5Click(Sender: TObject);
  459. begin
  460. SaveD.Filter := GetImageFileFormatsFilter(False);
  461. SaveD.FileName := ChangeFileExt(ExtractFileName(FFileName), '');
  462. SaveD.FilterIndex := GetFileNameFilterIndex(FFileName, False);
  463. if SaveD.Execute then
  464. begin
  465. FFileName := ChangeFileExt(SaveD.FileName, '.' + GetFilterIndexExtension(SaveD.FilterIndex, False));
  466. SaveFile(FFileName);
  467. end;
  468. end;
  469. procedure TMainForm.MenuItem7Click(Sender: TObject);
  470. begin
  471. Close;
  472. end;
  473. procedure TMainForm.OpenFile(const FileName: string);
  474. var
  475. T: Int64;
  476. begin
  477. FFileName := FileName;
  478. try
  479. T := GetTimeMicroseconds;
  480. FImage.LoadMultiFromFile(FileName);
  481. MeasureTime(Format('File %s opened in:', [ExtractFileName(FileName)]), T);
  482. except
  483. FImage.CreateFromParams(32, 32, ifA8R8G8B8, 1);
  484. MessageDlg('Error when loading file: ' + FileName, mtError, [mbOK], 0);
  485. end;
  486. SelectSubimage(0);
  487. end;
  488. procedure TMainForm.SaveFile(const FileName: string);
  489. var
  490. T: Int64;
  491. begin
  492. try
  493. T := GetTimeMicroseconds;
  494. FImage.SaveMultiToFile(FileName);
  495. MeasureTime(Format('File %s saved in:', [ExtractFileName(FileName)]), T);
  496. except
  497. MessageDlg('Error when saving file: ' + FileName, mtError, [mbOK], 0);
  498. end;
  499. end;
  500. procedure TMainForm.SelectSubimage(Index: LongInt);
  501. begin
  502. FImage.ActiveImage := Index;
  503. MenuItemActSubImage.Caption := Format('Active Subimage: %d/%d', [FImage.ActiveImage + 1, FImage.ImageCount]);
  504. UpdateView;
  505. end;
  506. procedure TMainForm.UpdateView;
  507. begin
  508. Image.Picture.Graphic.Assign(FImage);
  509. end;
  510. procedure TMainForm.MeasureTime(const Msg: string; const OldTime: Int64);
  511. begin
  512. PanelStatus.Caption := Format(' %s %.0n ms', [Msg, (GetTimeMicroseconds - OldTime) / 1000.0]);
  513. end;
  514. initialization
  515. {$I mainunit.lrs}
  516. {
  517. File Notes:
  518. -- TODOS ----------------------------------------------------
  519. - add more canvas stuff when it will be avaiable
  520. -- 0.24.1 Changes/Bug Fixes ---------------------------------
  521. - Added status bar which shows times taken by some oprations.
  522. - Reworked manipulation commands to get rid of UpdateView calls
  523. everywhere.
  524. - With Lazarus 0.9.24 images are now displayed with
  525. proper transparency (those with alpha). Also it doesn't
  526. screw up some images with 'Fit to window' so that is now
  527. default.
  528. -- 0.23 Changes/Bug Fixes -----------------------------------
  529. - Catches exceptions during file load/save.
  530. -- 0.21 Changes/Bug Fixes -----------------------------------
  531. - Save As... now saves all images levels instead of just current one.
  532. - Added XP controls manifest to resource file.
  533. - Added new filters to Effects menu.
  534. -- 0.19 Changes/Bug Fixes -----------------------------------
  535. - you can now open image in Imager from shell by passing
  536. path to image as parameter: 'LCLImager /home/myimage.jpg'
  537. - added Reload from File menu to reload image from disk
  538. (poor man's Undo)
  539. - added Effects menu with some convolution filters
  540. - added support for displaying of multi images
  541. -- 0.17 Changes/Bug Fixes -----------------------------------
  542. - added Nearest, Bilinear, and Bicubic filter options to
  543. Resize To 50/200% menu items
  544. - better handling of file exts when using save dialog
  545. - added rotations to Manipulate menu
  546. - now works well in Linux too
  547. -- 0.15 Changes/Bug Fixes -----------------------------------
  548. - created
  549. }
  550. end.