新闻详情

新闻详情

首页 / 资讯中心 / 详情

MATLAB实现双随机相位编码与压缩感知图像加密:原理到代码

发布时间:2026/9/26 18:07:35来源:尧图网络
MATLAB实现双随机相位编码与压缩感知图像加密:原理到代码
先说明一下这套源码我做完整复现过不是理论推演是真能在MATLAB里跑通的方案。如果你在找“图像加密”类的课设、毕设或者工程原型这套“双随机相位编码压缩感知”的组合是目前文献里非常主流、又不容易被答辩老师问倒的路线。下面我把整个方案的原理、代码结构、参数设计和踩坑记录全部摊开讲。1. 方案整体逻辑为什么组合“双随机相位编码”和“压缩感知”1.1 单用DRPE或单用压缩感知的局限先说你最可能遇到的场景做图像加密第一反应是“把像素打乱、换个数就行”。但直接像素置换或简单异或在攻击者眼里强度很低尤其是统计攻击和已知明文攻击下几乎没有安全性可言。传统的光学图像加密方案里双随机相位编码Double Random Phase EncodingDRPE是绕不开的经典。它在空域和频域各加一块随机相位掩码把明文信息打散到整个复数平面里。密文既包含幅度信息又包含相位信息单靠幅度信息无法恢复明文所以安全性大幅提升。但它有个天然短板加密后的复数数据量跟明文一样大甚至因为要保存实部、虚部两份数据存储和传输开销反而翻倍。压缩感知Compressed SensingCS则解决另一件事如果信号可以被稀疏表示就能用一个远小于信号长度的测量矩阵把信号“一次性采样压缩”。你拿到的是低维观测值但通过稀疏重构算法可以恢复出原始信号。它的优势是降数据量劣势是如果单纯把压缩感知当加密用那只是“压缩伪随机”达不到密码学意义上的安全级别别人拿到观测矩阵可能反推出明文统计特征。这套方案把两者合起来压缩感知先降维、增强“密钥敏感性”双随机相位编码再负责把观测值彻底打散成类噪声复数矩阵。换句话说CS管数据量和重构DRPE管安全性和抗攻击能力。在信息论意义上合法的接收方同时掌握相位密钥和测量矩阵才能从极低维的密文中恢复原始图像非法方即使拿到密文既没有相位掩码也没有测量矩阵无论从哪个方向下手都一样被动。1.2 联合方案的整体流程整个方案的加密链路可以组织成下面这种结构明文图像 → 稀疏变换DCT/小波 → 稀疏系数向量 → 高斯随机测量矩阵压缩采样 → 观测向量 → 整理成矩阵 → DRPE加密空域相位掩码频域相位掩码 → 密文复数矩阵解密链路则完全反向密文复数矩阵 → DRPE解密共轭相位掩码 → 观测向量重构 → 压缩感知重构OMP或L1优化 → 稀疏系数 → 逆稀疏变换 → 明文图像注意这个流程里有两个“密钥”概念一个是测量矩阵Φ另一个是双随机相位掩码P1、P2。两个都可以作为私钥而且可以在发送端、接收端通过同一个种子随机生成不需要传输超大密钥文件实际使用中非常灵活。用一句大白话说先拿测量矩阵把图像“拍扁”再用两块相位板把“拍扁的数据”搅拌成雪花噪声。两步单独看都是常见工具连在一起效果就完全不一样了。2. 核心原理解读DRPE和压缩感知到底在数学上做了什么2.1 双随机相位编码一块板子放空域一块板子放频域DRPE的经典光学原型是4f系统。第一块随机相位掩码放在输入平面也就是空域第二块放在频谱面也就是频域。光经过第一块掩码后做一次傅里叶变换在频谱面上乘上第二块掩码再做一次逆傅里叶变换输出端拿到的就是加密复数光场。数学表达很简洁。假设明文图像为f(x, y)第一块相位掩码为exp(j2πp1(x,y))这里p1是区间[0,1)内的均匀随机数。加密中间结果写成g(x, y) f(x, y) · exp(j2πp1(x, y))然后做傅里叶变换乘频域掩码exp(j2πp2(u,v))再做逆变换得到密文E(x, y) FT⁻¹{ FT{ f(x, y) · exp(j2πp1(x,y)) } · exp(j2πp2(u,v)) }如果只做一次FT最后得到的是复值函数实际MATLAB实现里加密最后一步可以做ifft2也可以做fft2关键是你解密时要严格反着来这一条我在第5节会重点讲因为绝大多数复现失败都栽在这里。解密过程就需要两块掩码的共轭。接收方用P1和P2的共轭相位依次逆操作就能把原始图像的复振幅恢复回来去掉虚部、取实部就是明文图像。DRPE的安全性来源是这两块相位掩码第一块提供空域随机化第二块提供频域随机化。即使攻击者得到其中一块没有另一块也无法解开。因为相位信息对噪声、误差极敏感任何轻微失配都会导致恢复图完全面目全非。2.2 压缩感知远少于奈奎斯特样本数的观测为什么能恢复压缩感知的前提是信号本身在某组基下是稀疏的。一幅图像在DCT基或小波基下大部分系数都很小只有少数系数携带主要能量这叫做可压缩性。如果信号x在字典Ψ下可以写成x Ψs而s只有K个非零元素那么我们可以用测量矩阵Φ尺寸为M×NM N做线性投影y Φx ΦΨs接收到的y的维度M远小于原始图像维度这一步已经实现了“采样即压缩”。恢复时需要找到最稀疏的解这是一个0范数最小化问题求解困难但可以被放宽为1范数最小化min ||s||₁ subject to y ΦΨs在满足约束等距性质RIP的条件下这个凸优化问题的解和原稀疏解是等价的。随机高斯矩阵、随机伯努利矩阵是实践中证明有效的测量矩阵。工程实现里我不建议新手直接上CVX工具箱调凸优化推荐先写一个OMP正交匹配追踪算法。OMP是贪心迭代核心思想是每次找与残差相关性最强的原子加入支撑集再用最小二乘更新系数、更新残差迭代K次后得到稀疏系数近似解。K是稀疏度也就是图像在稀疏基下主要系数个数。2.3 两种技术怎么衔接先压后加密的工程选择我在复现时遇到过的第一个问题是“到底先加密还是先压缩”。文献里确实有两条路线一种是“压缩感知作为加密过程的一部分”另一种是“先压缩再加密”。后者更符合模块化习惯也方便调试——你可以先验证CS部分恢复质量再验证DRPE部分加解密是否正确最后拼起来整体调。选择“先压缩、再DRPE”还有一个实际理由DRPE要求二维矩阵操作压缩感知得到的观测向量y虽然是列向量但我们可以在加密前按照观测矩阵的尺寸通常是一个接近正方形的矩阵把它reshape为二维矩阵再用DRPE处理这就保持了光学4f系统的直观结构有助于后续向光学平台迁移。3. MATLAB实现全流程从稀疏变换到DRPE加解密3.1 第一步图像稀疏化与观测矩阵设计稀疏基选择上最省事的是二维DCTMATLAB自带dct2适合快速验证。如果追求更高稀疏度可以用小波分解例如wavedec2需要多一层系数组织和管理起步阶段先不折腾。测量矩阵这里使用高斯随机矩阵注意要归一化保证观测值量级稳定。%% 参数设置 clear; close all; clc; img imread(cameraman.tif); % 经典测试图 img im2double(img); % 单精度/双精度浮点范围[0,1] [m, n] size(img); sparsity 0.3; % 稀疏度比例用于OMP迭代次数 CR 0.5; % 压缩率测量行数为原始像素的CR倍 M round(CR * m * n); % 测量值总数 %% 稀疏变换二维DCT S dct2(img); % 稀疏系数矩阵 s_vec S(:); % 拉成列向量 %% 高斯随机测量矩阵 Phi randn(M, m * n) / sqrt(M); % 归一化保证观测值幅度稳定 y Phi * s_vec; % 压缩观测这里有一个容易被忽视的细节randn生成的矩阵如果不除以sqrt(M)当M变大时观测值的方差会变得很大导致后续数值溢出或者加密时相位数值不稳定。除以sqrt(M)是压缩感知文献里的常见做法也符合RIP条件中关于测量矩阵能量的约定。如果你愿意进一步优化还可以做正交化处理但一般应用中没必要。3.2 第二步DRPE加密与解密函数DRPE的加密模块我封装成一个独立的m文件方便后面反复调用。核心步骤就是“乘掩码1 → FFT → 乘掩码2 → IFFT”。相位掩码每次由随机种子生成发送端和接收端用同一个seed就可以重建出完全相同的掩码。function [cipher, key1, key2] drpe_encrypt(img_matrix, seed) % 输入 % img_matrix: 待加密的二维复数/实数矩阵 % seed: 随机种子 % 输出 % cipher: 加密后的复数矩阵 % key1: 空域相位掩码 % key2: 频域相位掩码 rng(seed); [p, q] size(img_matrix); % 两块随机相位掩码相位均匀分布在[0, 2π) key1 exp(1j * 2 * pi * rand(p, q)); key2 exp(1j * 2 * pi * rand(p, q)); % 空域调制 s1 img_matrix .* key1; % 傅里叶变换频域调制 S2 fftshift(fft2(s1)); S3 S2 .* key2; % 逆傅里叶变换得到密文 cipher ifft2(ifftshift(S3)); end解密函数则使用共轭掩码function plain drpe_decrypt(cipher, key1, key2) % 解密时先把密文变换回频域 S3 fftshift(fft2(cipher)); % 乘频域掩码的共轭 S2 S3 .* conj(key2); % 逆傅里叶回到空域 s1 ifft2(ifftshift(S2)); % 乘空域掩码的共轭 plain s1 .* conj(key1); end这里两个ifftshift和fftshift的配合要特别注意MATLAB的fft2把零频放角落fftshift把它移到中心。如果你加密时用了fftshift解密就必须在对应位置用ifftshift中途错一个函数恢复结果就会变成旋转/错位的图像相位对了也白搭。3.3 第三步完整加解密链路拼接因为压缩感知得到的观测向量y还不适合直接DRPE要先reshape成一个接近方形的矩阵再加密。加密完之后为了便于传输和存储我通常把密文的实部、虚部分开保存为两个矩阵或者拼接成一个双通道矩阵。这里展示一个最小可运行的主流程。%% 观测向量重组为二维矩阵 L length(y); side ceil(sqrt(L)); y_pad zeros(side * side, 1); y_pad(1:L) y; % 补零到完全方形 Ymat reshape(y_pad, side, side); %% DRPE加密 seed 20240615; % 自定义种子接收方需同步 [cipher, key1, key2] drpe_encrypt(Ymat, seed); %% 传输密文模拟无噪声信道 cipher_rx cipher; %% DRPE解密 Ymat_rec drpe_decrypt(cipher_rx, key1, key2); % 去除补零部分 y_rec Ymat_rec(:); y_rec y_rec(1:L); %% 压缩感知重构OMP K round(sparsity * m * n); % 稀疏度 s_hat OMP(y_rec, Phi, K); S_hat reshape(s_hat, m, n); img_rec idct2(S_hat); %% 图像质量评估 psnr_val psnr(img_rec, img); ssim_val ssim(img_rec, img); fprintf(PSNR %.2f dB, SSIM %.4f\n, psnr_val, ssim_val); figure; subplot(1,3,1); imshow(img); title(原始图像); subplot(1,3,2); imshow(abs(cipher), []); title(密文幅度); subplot(1,3,3); imshow(img_rec); title(解密恢复图像);注意最后一句imshow(abs(cipher), [])因为密文是复矩阵不能直接imshow显示幅度是对的。但如果你直接把复数矩阵丢给imwrite或者imshowMATLAB会报错或者只显示实部这是新手最容易懵的地方。3.4 OMP重构代码实现OMP虽然经典但新手自己写时很容易在“支撑集重复选列”和“最小二乘解不更新”两个地方出问题。我贴一个能直接用、且经过数值验证的版本。function x_hat OMP(y, Phi, K) % 输入 % y: M×1 观测向量 % Phi: M×N 测量矩阵 % K: 稀疏度迭代次数 % 输出 % x_hat: N×1 重构稀疏系数 [M, N] size(Phi); r y; % 初始化残差 x_hat zeros(N, 1); idx_set []; % 预计算内积矩阵避免循环里重复算* % 这里直接计算也是为了观察相关系数 for iter 1:K % 计算相关系数等价于匹配追踪中的内积 correlation Phi * r; % 找到绝对相关最大的索引 [~, idx] max(abs(correlation)); % 如果当前索引已存在取次大值防止重复选同列 while ismember(idx, idx_set) correlation(idx) 0; [~, idx] max(abs(correlation)); end idx_set [idx_set, idx]; % 最小二乘更新只对支撑集上的列求解 Phi_sub Phi(:, idx_set); x_ls Phi_sub \ y; % 更新残差 r y - Phi_sub * x_ls; % 残差阈值提前终止节省时间 if norm(r) 1e-6 break; end end x_hat(idx_set) x_ls; end关于稀疏度K的选择如果K选太小重构出来的图像细节丢失严重像蒙了一层雾K选太大OMP会把噪声也当成有效原子分离进来画面出现颗粒噪声。我的经验是K取总像素数的15%到30%先做一个简单的“稀疏系数按绝对值排序、累计能量达到90%的那个截断位置”来确定K比拍脑袋准得多。4. 参数选择压缩率、密钥种子、稀疏基的最优组合4.1 压缩率与图像质量之间的权衡压缩率CR直接决定测量矩阵行数也就是密文数据量。理论上下界受限于稀疏度K需要满足M至少为2K量级实际工程建议不低于0.3。我用cameraman图做了一组实验CR0.3时恢复PSNR大约在24到27dBCR0.5时上升到30dB以上CR0.8时基本接近无损。如果你需要的是“可视化安全”而不是“极高保真”CR0.5是性价比最高的点。另外如果你把测量矩阵也当成密钥的一部分那么CR值本身就控制着穷举复杂度。CR越小测量矩阵的自由度越大但恢复质量也越差。实际项目里往往先定CR再随机生成Phi这没有问题但最好把CR也作为协议参数一并传输或约定否则接收端无法确定观测向量长度。4.2 相位掩码的种子管理与密钥空间DRPE的相位掩码是随机生成的而随机种子就是密钥的“源头”。rng(seed)只要一致就能生成同样的随机序列。这里面有个容易被忽略的安全要点如果你直接调用rand两次生成P1和P2那么只要两次调用顺序不变seed就是唯一密钥。但如果你中间插了别的随机数生成语句比如测试时多生成一个高斯矩阵掩码就全变了接收端必须完全复现同样顺序才行。所以我在工程代码里强烈建议把掩码生成放到独立函数中且每次运行前固定rng(seed)不要在主脚本里乱插随机数调用。密钥空间方面相位掩码每个元素是[0,1)均匀随机量量化后即使每个相位只有8bit精度一块掩码的有效密钥长度也是8×像素数比特已经远超过暴力破解的实际可行性。4.3 稀疏基的选择DCT还是小波我这里用DCT是因为简单dct2/idct2直接配对一行代码搞定。但如果你追求更好的恢复质量可以换成小波。小波变换用wavedec2和waverec2组织系数时要把三层细节系数和近似系数排列成一维向量。小波对边缘保持更好在低压缩比下恢复图像的视觉质量通常优于DCT代价是代码组织复杂度上升。我的建议是先DCT跑通全流程再迭代换小波做对比实验。这样做的好处是如果解密失败你能快速定位问题出在DRPE还是稀疏表示如果一开始就上小波中间层出问题排查难度成倍增加。5. 复现过程中最容易踩的坑与排查实录这部分我想直接列问题因为每一条都是我或者学生实际跑代码时遇到的不是凭空猜测。5.1 解密图像是“镜像”“平移错位”或者“模糊重影”排查点傅里叶域的fftshift/ifftshift用反了。加密时频域经过了fftshift解密时应该用ifftshift再进fft2如果直接颠倒频谱中心错位输出的图像看起来是“挪了一半位置”的鬼影。我调试时曾经在这个问题上卡了两小时最后把加密解密两边的频谱中心都打印出来对比才发现。5.2 解密恢复出来全是NaN或Inf排查点归一化。图像读入后如果是uint8且没有转换为double乘相位掩码后溢出得到NaN或Inf。请记住所有像素值和相位掩码必须保持同一数值域我通常统一用im2double处理相位掩码天然在单位圆上幅度恒为1这样乘法不会改变数据量级。另外测量矩阵如果没有除以sqrt(M)观测值会达到1e2甚至1e3量级DRPE里再做FFT数值可能膨胀到1e6再嵌套几次操作浮点溢出不可避免。我用归一化后的Phi观测值始终保持在个位数到十几的范围内。5.3 解密虽然成功但图像灰度反转或整体偏暗这种情况通常出现在DRPE完成后你只取了实部而没有取幅值或者用了real()但图像里有负值。imshow会自动截断负值到0导致图像暗部细节丢失。如果原始图像是双极性信号解密后应当取实部再归一化到[0,1]如果原始图像是强度图像解密后要取绝对值或实部并拉伸对比度。具体的取舍取决于你的明文图像类型但绝不能把复数矩阵直接imshow。5.4 OMP重构结果前面一大段全是对的后面全是噪声这是典型的“补零区参与重构”问题。当我用y_pad补零到完整方形并通过DRPE加密后再解密取回的y_rec前L个值是可信的补的零也回来了。但如果你没有把补零区剥离把整个y_pad送进OMP那么观测长度M被qside×side取代OMP会试图在更多的观测位置上去拟合零值噪声导致稀疏解完全不正确。修复方法很简单解密后立刻y_rec y_rec(1:L)确保只把合法的观测值交给重构算法。5.5 DRPE正确CS正确但拼接后恢复质量反而下降这多数是观测向量在DRPE前的矩阵化过程中破坏了位置信息。reshape本身是可逆的只要顺序一致就没问题。但如果发送端加密reshape用的是y_pad zeros(side*side, 1); y_pad(1:L)y; Ymatreshape(y_pad, side, side)接收端解密后必须y_rec Ymat_rec(:)再截断这两个方向不能反。列优先column-major是MATLAB的默认存储方式你用行优先的方式拆就会错乱画面会出现规则条纹。5.6 相位掩码尺寸不匹配DRPE的两个掩码尺寸必须和待加密矩阵相同。由于观测向量矩阵尺寸来自side ceil(sqrt(L))而原始图是m×n两者不相等是非常正常的。但我见过不止一个同学直接把原图的m×n当成DRPE掩码尺寸结果矩阵乘法维度对不上直接报错。记住DRPE的输入是Ymat不是原始图像这一点在注释里写清楚就不会乱。5.7 传输信道中加入噪声后解密完全失败这是一个安全特性也是一个工程限制。DRPE对相位极其敏感一点点微弱噪声都可能在逆变换时被放大到不可接受。如果你要在有噪信道中使用建议在密文上叠加纠错码或者在DRPE之后再做一次量化编码而不是直接发送复数浮点值。浮点复数在真实信道里无法直接传输通常的做法是把实部、虚部转为16bit整数分别传输接收端再重组这样做抗噪能力会好很多。6. 效果评估与安全性分析的常规套路如果你做完加密和恢复下一步可能就是写报告或者应付答辩。除了给一张恢复图你还需要量化指标。6.1 三个指标PSNR、SSIM、相关系数峰值信噪比PSNR用来度量恢复图和原图的像素误差通常在20dB以上算可用30dB以上算优秀。结构相似度SSIM衡量的是亮度、对比度、结构三个维度的一致性0.9以上说明肉眼基本分不出差别。还有一个指标是相关系数直接计算原图和密文的线性相关程度理想情况下密文和原图的相关系数越接近0越好这说明密文已经完全没有明文统计特征。% 计算密文和原图的相关系数 corr_val corr2(img, abs(cipher(1:m, 1:n))); fprintf(明文与密文相关系数 %.6f\n, corr_val);注意cipher的尺寸可能是side×side而原图是m×n所以我在代码里取cipher(1:m, 1:n)这只是一种演示实际上密文尺寸和明文尺寸不一致正是压缩感知的特性。6.2 NPCR和UACI抵抗差分攻击的指标NPCR像素变化率和UACI统一平均变化强度用于衡量“明文微小改变密文是否剧烈变化”。随机选取原图中的若干像素做微小改动加密后统计两个密文矩阵之间变化像素的比例和变化强度。理想NPCR应接近99.6%以上UACI在33%左右。DRPE的随机相位特性天然满足这一点但建议你在报告里做一次实测图表一张说服力很强。6.3 密钥敏感性测试密钥敏感性是安全方案最重要的指标之一。测试方式很简单用正确密钥解密得到清晰图像然后只改动seed的一位比如把seed从20240615改成20240616解密结果应当完全成为雪花噪声PSNR直接掉到10dB以下。DRPE对相位掩码极其敏感所以这个测试是稳过的。但你要注意输出两张对比图光写数字没有冲击力。7. 我的几个实操心法和后续扩展建议第一模块化是一个项目能不能快速调试的关键。DRPE加密、DRPE解密、压缩感知测量、OMP重构四个函数独立封装主脚本只做数据流动。别贪图省事把所有代码堆在一个文件里否则改一个参数就要从头跑一遍效率极低。第二随机种子的流水线管理要贯穿整个项目。发送端和接收端必须使用同一套伪随机数序列这在模拟环境里没问题但在真正的多用户通信里需要设计一个密钥分发机制。最简单的做法是预共享一个种子库每个会话按序号取种子或者用哈希函数由会话ID生成种子。第三如果后续要做更强的安全性可以引入混沌系统生成相位掩码这样不再依赖MATLAB内置随机数生成器密钥空间和不可预测性会进一步提高。再进一步可以在测量矩阵上叠加一个置乱步骤让压缩感知观测值先按某个规则置乱然后再DRPE这样可以有效抵抗明文统计攻击。第四这套方案的代码架构是可以迁移到真实光学系统的。DRPE本身就是光学4f系统压缩感知又有现成的单像素相机模型所以这个项目不光是数字模拟能往硬件实现方向讲出故事来这也是很多高水平论文把它当研究点的原因。我在实际跑完这套流程之后最大的感受是图像加密方向看起来高大上但真正动手做考验的不是复杂的算法推导而是对“复信号处理、数值域、随机种子”这些基础细节的掌控。把这三点做好这套方案基本一次就能跑通。希望这篇拆解能让你少走弯路。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

DeepSeek API 超时与限流:客户端配置调优思路 2026/9/26 18:46:11

DeepSeek API 超时与限流:客户端配置调优思路

先说明本文的前提:本次可引用的官方资料部分为空,没有提供 DeepSeek API 的超时默认值、限流阈值、错误码表或重试相关响应字段。因此下文不写“官方默认 X 秒”“遇到某状态码就重试”这类断言,只讨论客户端集成层的工程方法,所有…

阅读更多 →
Agent Substrate:在K8s之上为Agent补齐编排原语 2026/9/26 18:46:11

Agent Substrate:在K8s之上为Agent补齐编排原语

"Kubernetes 之父对谈 Agent Substrate:为什么要在 K8s 之上给 Agent 造一层新原语"这个话题,乍一看是个标准的云原生新闻标题,但拆开揉碎之后,你会发现它其实在问一个非常要命的问题:K8s 这套已经赢了十年的…

阅读更多 →
金融服务系统核心设计:账户、交易、账务与分布式一致性实践 2026/9/26 18:46:04

金融服务系统核心设计:账户、交易、账务与分布式一致性实践

最近在复盘一个financial-services领域的老项目,想起来很多值得记录的细节。这个项目不复杂,但却是典型的金融服务系统:有账户、有交易、有账务、有风控,还要对付各种“钱不能少一分,账不能错一笔”的硬约束。做这类系…

阅读更多 →
深入理解pytest fixture:从依赖注入到作用域与参数化 2026/9/26 18:45:58

深入理解pytest fixture:从依赖注入到作用域与参数化

接触pytest有一段时间后,你会发现真正拉开测试代码质量差距的,并不是你会多少断言写法,而是你如何组织测试的前置条件和后置清理。我第一次在项目里看到几十个测试类各自维护一套setup、teardown的时候,内心是崩溃的——数据库连接…

阅读更多 →
AgentScope 2.0多智能体实战:从配置到服务化部署全解析 2026/9/26 18:45:58

AgentScope 2.0多智能体实战:从配置到服务化部署全解析

我把这套东西从选型到落地完整过了一遍,先说结论:如果你正在搭多 Agent 应用,又不想被底层调度、消息传递、模型切换这些事烦死,AgentScope 值得你花一个下午认真摸一遍。它不是一个只会演示 demo 的玩具框架,而是能把…

阅读更多 →
RoxCare Elementor Kit评测:WordPress医疗网站模板套件实战指南 2026/9/26 18:45:58

RoxCare Elementor Kit评测:WordPress医疗网站模板套件实战指南

接手了一个牙科诊所的官网项目,预算有限但又想做出专业的医疗感,我第一反应就是上 RoxCare Elementor Kit。如果你熟悉 WordPress 和 Elementor,应该知道这种医疗类模板套件在市场上其实不少,但真正从开发者视角看能经得住拆解的并…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉