unit umain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, imageenview, ExtCtrls, ieview, iemview, StdCtrls, ComCtrls, imageenproc, hyiedefs, hyieutils, ieopensavedlg, imageenio, iemio, Buttons, iexBitmaps, iesettings; type TMainForm = class(TForm) Panel1: TPanel; btnOpen: TButton; ImageEnMView1: TImageEnMView; ImageEnView1: TImageEnView; Panel2: TPanel; Splitter1: TSplitter; Label1: TLabel; trkZoom: TTrackBar; chkQualityFilter: TCheckBox; GroupBox1: TGroupBox; lblImageTypeD: TLabel; lblImageTypeV: TLabel; lblAcquisitionDateV: TLabel; lblAcquisitionDateD: TLabel; lblAcquisitionTimeD: TLabel; lblAcquisitionTimeV: TLabel; lblAnatomicRegionD: TLabel; lblAnatomicRegionV: TLabel; lblPatientsNameV: TLabel; lblPatientsNameD: TLabel; OpenImageEnDialog1: TOpenImageEnDialog; btnSave: TButton; btnAnimate: TSpeedButton; ProgressBar1: TProgressBar; btnMoreTags: TButton; btnSaveAsDicom: TButton; SaveImageEnDialog1: TSaveImageEnDialog; procedure FormCreate(Sender: TObject); procedure btnMoreTagsClick(Sender: TObject); procedure btnOpenClick(Sender: TObject); procedure ImageEnMView1ImageSelect(Sender: TObject; idx: Integer); procedure trkZoomChange(Sender: TObject); procedure chkQualityFilterClick(Sender: TObject); procedure OpenImageEnDialog1PreviewFile(Sender, Viewer: TObject; FileName: String; ParamsOnly: Boolean); procedure btnSaveClick(Sender: TObject); procedure btnAnimateClick(Sender: TObject); procedure ImageEnMView1FinishWork(Sender: TObject); procedure ImageEnMView1Progress(Sender: TObject; per: Integer); procedure btnSaveAsDicomClick(Sender: TObject); procedure ImageEnMView1PlayFrame(Sender: TObject; FrameIndex: Integer; var bShowFrame: Boolean); private { Private declarations } public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.DFM} {$R WindowsTheme.res} uses uDicomTags, iexMetaHelpers; procedure TMainForm.FormCreate(Sender: TObject); begin ImageEnMView1.SetModernStyling; ImageEnMView1.ThumbnailOptionsEx := ImageEnMView1.ThumbnailOptionsEx + [ietxCenterThumbnailColumn]; ProgressBar1.Visible := False; // This is not really necessary, as the tag names are constant anyway. Just for illustrative purposes { lblImageTypeD .Caption := TIEDicomTags.GetTagDescription($0008,$0008) + ':'; lblAcquisitionDateD .Caption := TIEDicomTags.GetTagDescription($0008,$0022) + ':'; lblAcquisitionTimeD .Caption := TIEDicomTags.GetTagDescription($0008,$0032) + ':'; lblAnatomicRegionD .Caption := TIEDicomTags.GetTagDescription($0008,$0104) + ':'; lblPatientsNameD .Caption := TIEDicomTags.GetTagDescription($0010,$0010) + ':'; } end; // Show Dicom Tags procedure TMainForm.btnMoreTagsClick(Sender: TObject); var dlgShowTags: TdlgShowTags; begin dlgShowTags := TdlgShowTags.create(Self); try dlgShowTags.ShowModal; finally dlgShowTags.free; end; end; // Open... procedure TMainForm.btnOpenClick(Sender: TObject); var fn:string; tags : TIEDicomTags; begin OpenImageEnDialog1.AutoSetFilterFileType := ioDicom; if OpenImageEnDialog1.Execute then begin fn := OpenImageEnDialog1.FileName; Caption := fn; ImageEnMView1.Clear; ImageEnView1.Blank; // allow multiselecting if pos('|', fn) > 0 then ImageEnMView1.MIO.LoadFromFiles( fn ) else ImageEnMView1.MIO.LoadFromFileAuto( fn ); // this last case allows to try load unrecognized DICOMs (also without extension) if ImageEnMView1.MIO.Aborting then ImageEnMView1.MIO.LoadFromFileDICOM( fn ); ImageEnMView1.SelectedImage := 0; ImageEnMView1ImageSelect(self, 0); ImageEnView1.Fit; trkZoom.Position := trunc(ImageEnView1.Zoom); btnAnimate.Enabled := ImageEnMView1.ImageCount > 1; // fill image info if ImageEnMView1.ImageCount > 0 then begin tags := ImageEnMView1.MIO.Params[0].DICOM_Tags; lblImageTypeV .Caption := tags.GetTagString( tags.IndexOf($0008,$0008) ); lblAcquisitionDateV .Caption := tags.GetTagString( tags.IndexOf($0008,$0022) ); lblAcquisitionTimeV .Caption := tags.GetTagString( tags.IndexOf($0008,$0032) ); lblAnatomicRegionV .Caption := tags.GetTagString( tags.IndexOf($0008,$0104) ); lblPatientsNameV .Caption := tags.GetTagString( tags.IndexOf($0010,$0010) ); btnMoreTags.Enabled := True; end; btnSaveAsDicom .Enabled := True; btnSave .Enabled := True; end; end; // Show full size image procedure TMainForm.ImageEnMView1ImageSelect(Sender: TObject; idx: Integer); begin if idx < ImageEnMView1.ImageCount then begin ImageEnMView1.CopyToIEBitmap( idx, ImageEnView1.IEBitmap ); ImageEnView1.IEBitmap.PixelFormat := ie24RGB; // necessary only when ZoomFilter<>rfNone ImageEnView1.Update; end; end; // Zoom procedure TMainForm.trkZoomChange(Sender: TObject); begin ImageEnView1.Zoom := trkZoom.Position; end; // Quality Filter procedure TMainForm.chkQualityFilterClick(Sender: TObject); begin if chkQualityFilter.Checked then ImageEnView1.ZoomFilter := rfTriangle else ImageEnView1.ZoomFilter := rfNone; end; // Occurs when a file is previewed // needed because some dicoms aren't recognized automatically, so we force to load dicoms when a file is not detected procedure TMainForm.OpenImageEnDialog1PreviewFile(Sender, Viewer: TObject; FileName: String; ParamsOnly: Boolean); var io: TImageEnIO; mio: TImageEnMIO; begin io := nil; mio := nil; if Viewer is TImageEnView then io := (Viewer as TImageEnView).IO else mio := (Viewer as TImageEnMView).MIO; if ParamsOnly and assigned(io) then begin io.ParamsFromFile(FileName); if io.Aborting then io.ParamsFromFile(FileName,ioDICOM); end else if assigned(io) then begin io.LoadFromFileAuto(FileName); if io.Aborting then io.LoadFromFileDICOM(FileName); end else if assigned(mio) then begin mio.LoadFromFileAuto(FileName); if mio.Aborting then mio.LoadFromFileDICOM(FileName); end; end; // General Save procedure TMainForm.btnSaveClick(Sender: TObject); var i : integer; begin SaveImageEnDialog1.AutoSetFilterFileType := -1; SaveImageEnDialog1.Filename := ''; if SaveImageEnDialog1.Execute then begin // set output pixel format to 24 bit ImageEnMView1.MIO.Params[0].SamplesPerPixel := 3; ImageEnMView1.MIO.Params[0].BitsPerSample := 8; ImageEnMView1.MIO.DuplicateCompressionInfo; for i := 0 to ImageEnMView1.ImageCount - 1 do begin ImageEnMView1.GetTIEBitmap(i).PixelFormat := ie24RGB; ImageEnMView1.ReleaseBitmap(i); end; ImageEnMView1.MIO.SaveToFile( SaveImageEnDialog1.FileName ); end; end; // Save as DICOM procedure TMainForm.btnSaveAsDicomClick(Sender: TObject); begin SaveImageEnDialog1.AutoSetFilterFileType := ioDicom; SaveImageEnDialog1.Filename := ''; if SaveImageEnDialog1.Execute then ImageEnMView1.MIO.SaveToFile( SaveImageEnDialog1.FileName ); end; // Animate procedure TMainForm.btnAnimateClick(Sender: TObject); var i : integer; iInterval : Integer; begin iInterval := ImageEnMView1.MIO.Params[0].ImageDelayTime; if iInterval = 0 then iInterval := 100; for i := 0 to ImageEnMView1.ImageCount - 1 do ImageEnMView1.ImageDelayTime[i] := iInterval; ImageEnMView1.Playing := btnAnimate.Down; end; // Show progress procedure TMainForm.ImageEnMView1Progress(Sender: TObject; per: Integer); begin ProgressBar1.Position := per; ProgressBar1.Visible := True; end; // Reset progress procedure TMainForm.ImageEnMView1FinishWork(Sender: TObject); begin ProgressBar1.Position := 0; ProgressBar1.Visible := False; end; // Playing... Copy frame to ImageEnView procedure TMainForm.ImageEnMView1PlayFrame(Sender: TObject; FrameIndex: Integer; var bShowFrame: Boolean); begin ImageEnMView1.CopyToIEBitmap( frameIndex, ImageEnView1.IEBitmap ); ImageEnView1.Update; end; end.