BSOne.SFC/EM.Lib/ImageEn_SRC/Demos/InputOutput/Dicom/umain.pas

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.