276 lines
7.9 KiB
Plaintext
276 lines
7.9 KiB
Plaintext
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.
|