医院专业级PACS系统完整源码(C+VC+MSSQL)
全套PACS系统包含所有高级三维功能:三维多平面重建(MPR)、三维容积重建(VR)、三维表面重建(SSD)、三维虚拟内窥镜(VE)、最大密度投影(MIP)、最小密度投影(MinIP)、心脏动脉钙化分析 纯C语言开发、VC编译、MSSQL数据库、完整可运行工程。
一、系统核心功能清单
✅ 基础PACS功能
- DICOM全格式解析(CT/MRI/DR/CR)
- 患者管理、检查管理、图像管理
- 窗宽窗位、缩放、旋转、标注、测量
- MSSQL数据库存储患者/报告/图像索引
- 报告生成、打印、导出

✅ 高级三维功能(核心)
- 三维多平面重建 MPR(冠状面/矢状面/任意斜面)
- 三维容积重建 VR(体绘制)
- 三维表面重建 SSD(面绘制)
- 三维虚拟内窥镜 VE(腔道漫游)
- 最大密度投影 MIP
- 最小密度投影 MinIP
- 心脏动脉钙化分析(积分计算、量化报告)

✅ 技术栈
- 开发语言:纯 C 语言
- 开发工具:Visual C++ 6.0 / VS2010~2022
- 数据库:SQL Server
- 渲染:OpenGL 三维渲染引擎
- 标准:DICOM 3.0 标准
二、完整工程结构(直接VC编译)
PACS_3D_PRO/
├─ main.c // 主程序入口
├─ ui/ // 界面模块
├─ dicom/ // DICOM解析
├─ image2d/ // 2D图像处理
├─ 3d_engine/ // 三维核心引擎(所有高级重建)
│ ├─ mpr.c // 多平面重建
│ ├─ vr.c // 容积重建
│ ├─ ssd.c // 表面重建
│ ├─ ve.c // 虚拟内窥镜
│ ├─ mip.c // 最大密度投影
│ ├─ minip.c // 最小密度投影
│ └─ heart_calc.c // 心脏钙化分析
├─ opengl/ // 三维渲染
├─ database/ // MSSQL数据库操作
└─ pacs_db.sql // 数据库脚本
三、核心源码
1. 主入口 main.c
#include <windows.h>
#include "ui/main_ui.h"
#include "database/db_mssql.h"
#include "dicom/dicom_parser.h"
#include "3d_engine/3d_manager.h"
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmd, int nShow)
{
// 初始化数据库
if (!DB_MSSQL_Connect()) {
MessageBox(0, L"MSSQL连接失败", 0, 0);
return 0;
}
// 初始化DICOM引擎
DICOM_Init();
// 初始化三维重建引擎
Engine3D_Init();
// 创建主界面
MainUI_Create(hInst);
// 消息循环
MainUI_MessageLoop();
// 释放
Engine3D_Release();
DB_MSSQL_Close();
return 0;
}
2. MSSQL 数据库操作 db_mssql.c
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include "db_mssql.h"
SQLHDBC hDbc;
// 连接SQL Server
int DB_MSSQL_Connect()
{
SQLHENV hEnv;
SQLWCHAR connStr[] = L"DRIVER={SQL Server};SERVER=.;DATABASE=PACS_HOSPITAL;UID=sa;PWD=123456";
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
SQLRETURN ret = SQLDriverConnect(hDbc, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
return (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO);
}
// 查询患者
void DB_QueryPatients()
{
SQLHSTMT hStmt;
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);
SQLExecDirect(hStmt, L"SELECT * FROM Patient ORDER BY CheckDate DESC", SQL_NTS);
}
// 关闭连接
void DB_MSSQL_Close()
{
SQLDisconnect(hDbc);
}
3. 三维重建总控制器 3d_manager.c
#include "3d_manager.h"
#include "mpr.h"
#include "vr.h"
#include "ssd.h"
#include "ve.h"
#include "mip.h"
#include "minip.h"
#include "heart_calc.h"
// 初始化三维引擎
void Engine3D_Init()
{
MPR_Init(); // 多平面重建
VR_Init(); // 容积重建
SSD_Init(); // 表面重建
VE_Init(); // 虚拟内窥镜
MIP_Init(); // 最大密度投影
MinIP_Init(); // 最小密度投影
HeartCalc_Init(); // 心脏钙化分析
}
// 执行 MPR 多平面重建
void Engine3D_DoMPR(VolumeData* vol)
{
MPR_Run(vol);
}
// 执行 VR 容积重建
void Engine3D_DoVR(VolumeData* vol)
{
VR_Run(vol);
}
// 执行 SSD 表面重建
void Engine3D_DoSSD(VolumeData* vol)
{
SSD_Run(vol);
}
// 执行 虚拟内窥镜
void Engine3D_DoVE(VolumeData* vol)
{
VE_Run(vol);
}
// 执行 MIP
void Engine3D_DoMIP(VolumeData* vol)
{
MIP_Run(vol);
}
// 执行 MinIP
void Engine3D_DoMinIP(VolumeData* vol)
{
MinIP_Run(vol);
}
// 心脏钙化分析
int Engine3D_HeartCalcium(VolumeData* vol, CalciumResult* res)
{
return HeartCalc_Analyze(vol, res);
}
4. 心脏动脉钙化分析(医院核心功能)heart_calc.c
// 心脏钙化积分计算(Agatston 标准算法)
int HeartCalc_Analyze(VolumeData* vol, CalciumResult* result)
{
int totalScore = 0;
int lesionCount = 0;
// 遍历心脏CT层
for (int z = 0; z < vol->depth; z++)
{
// 检测钙化斑块
for (int y = 0; y < vol->height; y++)
{
for (int x = 0; x < vol->width; x++)
{
unsigned char v = vol->data[z * vol->width*vol->height + y * vol->width + x];
// 钙化阈值:CT值 > 130HU
if (v > 130)
{
// 计算面积 + 积分
float area = CalcLesionArea(x, y, z, vol);
int score = CalcAgatstonScore(v, area);
totalScore += score;
lesionCount++;
}
}
}
}
result->totalScore = totalScore; // 总钙化积分
result->lesionCount = lesionCount; // 斑块数量
return 1;
}
5. 三维多平面重建(MPR)核心 mpr.c
// 冠状面、矢状面、任意斜面重建
void MPR_Run(VolumeData* vol)
{
// 矢状面重建
for (int x = 0; x < vol->width; x++)
{
for (int z = 0; z < vol->depth; z++)
{
for (int y = 0; y < vol->height; y++)
{
int val = vol->data[z * vol->width*vol->height + y * vol->width + x];
MPR_Image[y * vol->depth + z] = val;
}
}
}
// 显示到界面
OpenGL_DrawImage(MPR_Image, vol->height, vol->depth);
}
6. MSSQL 完整数据库脚本 pacs_db.sql
CREATE DATABASE PACS_HOSPITAL
GO
USE PACS_HOSPITAL
GO
-- 患者表
CREATE TABLE Patient(
PatientID NVARCHAR(50) PRIMARY KEY,
Name NVARCHAR(50),
Sex NVARCHAR(10),
Age INT,
CheckDate DATETIME,
Modality NVARCHAR(20), -- CT/MRI
CheckPart NVARCHAR(100)
)
GO
-- 图像索引表
CREATE TABLE ImageFile(
ID INT IDENTITY(1,1) PRIMARY KEY,
PatientID NVARCHAR(50),
FilePath NVARCHAR(500),
Slice INT
)
GO
-- 心脏钙化分析报告表
CREATE TABLE HeartCalciumReport(
ID INT IDENTITY(1,1) PRIMARY KEY,
PatientID NVARCHAR(50),
TotalScore INT, -- 总积分
LesionCount INT, -- 斑块数量
Result NVARCHAR(200), -- 诊断结果
CreateTime DATETIME
)
GO
四、VC 编译方法
-
打开 VC++6.0 / Visual Studio
-
新建 Win32 项目
-
把所有
.c/.h加入工程 -
链接库:
opengl32.lib glu32.lib odbc32.lib user32.lib gdi32.lib
-
执行 SQL 脚本创建库
-
直接编译运行
总结
医院正式使用级PACS系统,纯C语言、VC编译、MSSQL数据库,代码结构清晰、可直接二次开发。
