LEADTOOLS 入门教程: 使用 H264 视频创建 DICOM 文件 – 控制台 C#

本教程通过调整示例 LEADTOOLS 媒体文件之一的大小来对高清视频进行编码,以创建与 MPEG-4 AVC/H.264 BD 兼容的 DICOM 文件。

本教程介绍如何配置 LEADTOOLS DICOM Writer 过滤器,以使用 LEADTOOLS SDK 在 C# Window 控制台应用程序中使用 MPEG-2 传输中的 H.264 创建数据集。本教程通过调整示例 LEADTOOLS 媒体文件之一的大小来对高清视频进行编码,以创建与 MPEG-4 AVC/H.264 BD 兼容的 DICOM 文件。

概述
概括 本教程介绍如何使用 LEADTOOLS DICOM Writer 过滤器在 C# Windows 控制台应用程序中创建包含 H.264 压缩视频的 DICOM 文件。
完成时间 30分钟
视觉工作室项目 下载教程项目 (5 KB)
平台 Windows 控制台 C# 应用程序
集成开发环境 视觉工作室 2017、2019
开发许可 LEADTOOLS
所需知识

在使用文件观察器转换文件 – C# .NET Core教程之前,通过查看添加引用和设置许可证教程熟悉创建项目的基本步骤。

创建项目并添加 LEADTOOLS 引用

从添加引用和设置许可证教程中创建的项目副本开始。如果您没有该项目,请按照该教程中的步骤创建它。

所需的参考取决于项目的目的。可以通过本地 DLL 引用添加引用。

本教程需要以下本地 DLL,它们位于<INSTALL_DIR>LEADTOOLS22BinDotnet4x64:

  • Interop.LMDSKernelLib2.dll
  • Interop.LMVResizeLib.dll
  • Leadtools.dll
  • Leadtools.Codecs.dll
  • Leadtools.Drawing.dll
  • Leadtools.ImageProcessing.Color.dll
  • Leadtools.ImageProcessing.Core.dll
  • Leadtools.Multimedia.dll

还需要以下非 LEADTOOLS DLL:

  • System.Deployment.dll
  • System.Drawing.dll
  • System.Windows.Forms
  • stdole.dll

有关特定功能所需的 DLL 的完整列表,请参阅要包含在您的应用程序中的文件。

不同的 SDK 功能需要不同的引用。有关完整列表,请参阅您的申请中必须包括的多媒体文件。

设置许可证文件

许可证解锁项目所需的功能。它必须在调用任何工具包函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时许可证。

有两种类型的运行时许可证:

  • 评估许可证,在下载评估工具包时获得。它允许评估工具包。
  • 部署许可证。如果需要部署许可证文件和开发人员密钥,请参阅获取许可证。

笔记

添加 LEADTOOLS NuGet 引用和设置许可证在添加引用和设置许可证教程 中有更详细的介绍。

添加创建 DICOM 文件代码

创建项目、添加参考和设置许可证后,就可以开始编码了。

在解决方案资源管理器中,打开Program.cs。将以下语句添加到顶部的 using 块中Program.cs:

【C#】

using System;using System.IO;using Leadtools;using Leadtools.Dicom;using Leadtools.Dicom.Common.DataTypes;using Leadtools.Dicom.Common.Extensions;using Leadtools.Multimedia;using LTDicWrtLib;

请务必添加以下全局变量:

【C#】

static ConvertCtrl convert;

在Program类中,添加一个名为 的新方法CreateDICOMFile()。在方法内部调用这个方法Main(),如下图。此外,请务必Single-threaded Apartment (STA)通过添加[STAThread].

【C#】

[STAThread]static void Main(string[] args){SetLicense();CreateDICOMFile();}

将以下代码添加CreateDICOMFile()到编码高清视频的方法中,以创建 MPEG-4 AVC/H.264 BD 兼容的 DICOM 文件。您可以在此处.DS下载用于本教程的临时文件。

【C#】

private static void CreateDICOMFile(){string templateFile = @"FILE PATH TO TEMP Video_Photography.DS FILE";string inputFile = @"C:LEADTOOLS22ResourcesMediaDaDa_H264.mp4";string outputFile = @"FILE PATH TO OUTPUT THE DCM FILE TO";// Create instance of Convert control.convert = new ConvertCtrl();// Set the source and target filesconvert.SourceFile = inputFile;convert.TargetFile = outputFile;// Need to resize sample video to be HD since no HD videos are in the SDK setupconvert.SelectedVideoProcessors.Add(convert.VideoProcessors.Resize);LMVResizeLib.LMVResize resizeFilter = convert.GetSubObject(ConvertObject.SelVideoProcessor + 0) as LMVResizeLib.LMVResize;resizeFilter.ForceSquarePixelOutput = true;resizeFilter.Height = 1080;resizeFilter.Width = 1920;resizeFilter.OutputAspectRatioMode = LMVResizeLib.OutputAspectRatioModeConstants.OUTPUTASPECTRATIO_16_9;resizeFilter.HeightControlMode = LMVResizeLib.SizeControlModeConstants.SIZECONTROL_FIXED;resizeFilter.WidthControlMode = LMVResizeLib.SizeControlModeConstants.SIZECONTROL_FIXED;// Done configuring the resize filterSystem.Runtime.InteropServices.Marshal.ReleaseComObject(resizeFilter);resizeFilter = null;convert.VideoCompressors.H264.Selected = true;convert.AudioCompressors.AAC.Selected = true;LMH264EncoderLib.LMH264Encoder h264Encoder = convert.GetSubObject(ConvertObject.VideoCompressor) as LMH264EncoderLib.LMH264Encoder;h264Encoder.EnableRateControl = false;h264Encoder.QualityFactor = 28;h264Encoder.FrameRate = 29.970f;h264Encoder.EncodingSpeed = LMH264EncoderLib.eH264ENCODINGSPEED.H264SPEED_4;h264Encoder.EncodingThreads = LMH264EncoderLib.eH264ENCODINGTHREADS.H264THREAD_AUTO;h264Encoder.IFrameInterval = 11;h264Encoder.PFrameInterval = 1;h264Encoder.OutputFormat = LMH264EncoderLib.eH264OUTPUTFORMAT.H264FORMAT_HIGH_H264;// Done configuring the filterSystem.Runtime.InteropServices.Marshal.ReleaseComObject(h264Encoder);h264Encoder = null;// set the formatconvert.TargetFormat = TargetFormatType.MPEG2TransportDICOM;// Get the Dicom writer filter and set some options//NOTE: MPEG-2 Transport is the target filter here// DICOM writer is the file writer/Sink filterILTDicWrt2 dicomWriter = (ILTDicWrt2)convert.GetSubObject(ConvertObject.Sink);dicomWriter.DICOMTemplateFile = templateFile;dicomWriter.MPEG2DicomCompatibilityOption = MPEG2DicomCompatibilityConstants.MPEG2DICOMCOMP_IGNORE;// Done configuring the filterSystem.Runtime.InteropServices.Marshal.ReleaseComObject(dicomWriter);dicomWriter = null;// Add some event handlersconvert.Progress += new ProgressEventHandler(convert_Progress);convert.Complete += new EventHandler(convert_Complete);Console.WriteLine(string.Format("Starting to Convert {0}", convert.TargetFile));convert.StartConvert();while (convert.State != ConvertState.Stopped){System.Windows.Forms.Application.DoEvents();}DicomEngine.Startup();DicomDataSet ds = new DicomDataSet();ds.Load(convert.TargetFile, DicomDataSetLoadFlags.LoadAndClose);PatientBase patientBase = ds.Get<PatientBase>();patientBase.PatientName = new PersonName("Smith^John");patientBase.PatientSex = PatientSex.Male;patientBase.PatientID = "1234567890";patientBase.PatientBirthDate = DateTime.Parse("09/18/1970");patientBase.PatientBirthTime = DateTime.Parse(DateTime.Now.ToShortTimeString());ds.Set(patientBase);DicomElement element;element = ds.FindFirstElement(null, DicomTag.SOPInstanceUID, true);if (element != null)ds.SetValue(element, Leadtools.DicomDemos.Utils.GenerateDicomUniqueIdentifier());GenerateUidTag(ds, DicomTag.StudyInstanceUID);GenerateUidTag(ds, DicomTag.SeriesInstanceUID);GenerateUidTag(ds, DicomTag.SOPInstanceUID);ds.Save(convert.TargetFile, DicomDataSetSaveFlags.None);DicomEngine.Shutdown();Console.WriteLine("Patient information updated and new UIDs generated.");}

在Program类中,添加一个名为 的新方法GenerateUidTag(DicomDataSet dicom, long UidTag)。CreateDICOMFile()如上所示,将在方法内部调用此方法以创建唯一标识符。

private static void GenerateUidTag(DicomDataSet dicom, long UidTag){DicomElement element;element = dicom.FindFirstElement(null, UidTag, true);if (element != null)dicom.SetValue(element, Leadtools.DicomDemos.Utils.GenerateDicomUniqueIdentifier());}

Program在名为convert_Complete(object sender, EventArgs e)and的类中添加两个新的事件处理程序convert_Progress(object sender, ProgressEventArgs e)。这些将在CreateDICOMFile()方法内部使用,如上所示,并将用于将应用程序进度打印到控制台的目的。这些是可选的。

private static void convert_Complete(object sender, EventArgs e){Console.WriteLine(string.Format("nConversion of "{0}"" complete!""

                                                        

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年11月18日
下一篇 2022年11月18日

相关推荐

发表回复

登录后才能评论