基于最小拉普拉斯残差插值的去马赛克算法

作者:ghie9090日期:2025/11/25

基于最小拉普拉斯残差插值的去马赛克算法。这是一种用于从Bayer模式图像中恢复全彩色图像的高质量算法。

算法原理

最小拉普拉斯残差插值(MLRI)基于以下关键思想:

  • 颜色通道间的相关性:在同一位置,不同颜色通道间存在强相关性
  • 拉普拉斯算子:用于估计插值方向的平滑性
  • 残差最小化:选择使拉普拉斯残差最小的插值方向
  • 参考代码 利用最小拉普拉斯残差插值的去马赛克算法 www.youwenfan.com/contentcsm/82205.html

MATLAB实现

1function [rgb_image] = mlri_demosaic(bayer_image, pattern)
2% 最小拉普拉斯残差插值去马赛克算法
3% 输入:
4%   bayer_image - Bayer模式原始图像
5%   pattern - Bayer模式类型 ('rggb', 'bggr', 'grbg', 'gbrg')
6% 输出:
7%   rgb_image - 恢复的全彩色图像
8
9    if nargin < 2
10        pattern = 'rggb'; % 默认RGGB模式
11    end
12    
13    [h, w] = size(bayer_image);
14    rgb_image = zeros(h, w, 3);
15    
16    % 根据Bayer模式提取各通道采样位置
17    [R, G, B] = extract_bayer_channels(bayer_image, pattern);
18    
19    % 步骤1: 绿色通道插值(使用MLRI)
20    G_interp = mlri_green_interpolation(bayer_image, pattern, R, G, B);
21    
22    % 步骤2: 红色和蓝色通道插值
23    R_interp = mlri_redblue_interpolation(bayer_image, pattern, G_interp, 'red');
24    B_interp = mlri_redblue_interpolation(bayer_image, pattern, G_interp, 'blue');
25    
26    % 组合最终图像
27    rgb_image(:, :, 1) = R_interp;
28    rgb_image(:, :, 2) = G_interp;
29    rgb_image(:, :, 3) = B_interp;
30    
31    % 后处理
32    rgb_image = min(max(rgb_image, 0), 1);
33end
34
35function [R, G, B] = extract_bayer_channels(bayer, pattern)
36% 从Bayer图像中提取各通道的采样位置
37    [h, w] = size(bayer);
38    R = zeros(h, w);
39    G = zeros(h, w);
40    B = zeros(h, w);
41    
42    switch lower(pattern)
43        case 'rggb'
44            % R G
45            % G B
46            R(1:2:end, 1:2:end) = bayer(1:2:end, 1:2:end);
47            G(1:2:end, 2:2:end) = bayer(1:2:end, 2:2:end);
48            G(2:2:end, 1:2:end) = bayer(2:2:end, 1:2:end);
49            B(2:2:end, 2:2:end) = bayer(2:2:end, 2:2:end);
50            
51        case 'bggr'
52            % B G
53            % G R
54            B(1:2:end, 1:2:end) = bayer(1:2:end, 1:2:end);
55            G(1:2:end, 2:2:end) = bayer(1:2:end, 2:2:end);
56            G(2:2:end, 1:2:end) = bayer(2:2:end, 1:2:end);
57            R(2:2:end, 2:2:end) = bayer(2:2:end, 2:2:end);
58            
59        case 'grbg'
60            % G R
61            % B G
62            G(1:2:end, 1:2:end) = bayer(1:2:end, 1:2:end);
63            R(1:2:end, 2:2:end) = bayer(1:2:end, 2:2:end);
64            B(2:2:end, 1:2:end) = bayer(2:2:end, 1:2:end);
65            G(2:2:end, 2:2:end) = bayer(2:2:end, 2:2:end);
66            
67        case 'gbrg'
68            % G B
69            % R G
70            G(1:2:end, 1:2:end) = bayer(1:2:end, 1:2:end);
71            B(1:2:end, 2:2:end) = bayer(1:2:end, 2:2:end);
72            R(2:2:end, 1:2:end) = bayer(2:2:end, 1:2:end);
73            G(2:2:end, 2:2:end) = bayer(2:2:end, 2:2:end);
74    end
75end
76
77function G_interp = mlri_green_interpolation(bayer, pattern, R, G, B)
78% 基于MLRI的绿色通道插值
79    [h, w] = size(bayer);
80    G_interp = G; % 初始化,已有G像素保持不变
81    
82    % 定义拉普拉斯核
83    laplacian_kernel = [0, 1, 0; 1, -4, 1; 0, 1, 0];
84    
85    % 根据模式确定插值位置
86    switch lower(pattern)
87        case 'rggb'
88            % 在R和B位置插值G
89            for i = 2:h-1
90                for j = 2:w-1
91                    if mod(i,2) == 1 && mod(j,2) == 1 % R位置
92                        G_interp(i,j) = interpolate_g_at_r(bayer, i, j, laplacian_kernel, pattern);
93                    elseif mod(i,2) == 0 && mod(j,2) == 0 % B位置
94                        G_interp(i,j) = interpolate_g_at_b(bayer, i, j, laplacian_kernel, pattern);
95                    end
96                end
97            end
98            
99        case 'bggr'
100            % 类似处理其他模式...
101    end
102    
103    % 边界处理
104    G_interp = handle_boundaries(G_interp);
105end
106
107function g_value = interpolate_g_at_r(bayer, i, j, laplacian_kernel, pattern)
108% 在R位置插值G通道
109    % 水平方向插值候选
110    g_horizontal = (bayer(i, j-1) + bayer(i, j+1)) / 2;
111    
112    % 垂直方向插值候选
113    g_vertical = (bayer(i-1, j) + bayer(i+1, j)) / 2;
114    
115    % 计算拉普拉斯残差
116    residual_h = compute_laplacian_residual(bayer, i, j, g_horizontal, laplacian_kernel, 'horizontal', pattern);
117    residual_v = compute_laplacian_residual(bayer, i, j, g_vertical, laplacian_kernel, 'vertical', pattern);
118    
119    % 选择最小残差的方向
120    if abs(residual_h) < abs(residual_v)
121        g_value = g_horizontal;
122    elseif abs(residual_v) < abs(residual_h)
123        g_value = g_vertical;
124    else
125        g_value = (g_horizontal + g_vertical) / 2;
126    end
127end
128
129function g_value = interpolate_g_at_b(bayer, i, j, laplacian_kernel, pattern)
130% 在B位置插值G通道
131    % 与R位置类似,但考虑Bayer模式差异
132    g_horizontal = (bayer(i, j-1) + bayer(i, j+1)) / 2;
133    g_vertical = (bayer(i-1, j) + bayer(i+1, j)) / 2;
134    
135    residual_h = compute_laplacian_residual(bayer, i, j, g_horizontal, laplacian_kernel, 'horizontal', pattern);
136    residual_v = compute_laplacian_residual(bayer, i, j, g_vertical, laplacian_kernel, 'vertical', pattern);
137    
138    if abs(residual_h) < abs(residual_v)
139        g_value = g_horizontal;
140    elseif abs(residual_v) < abs(residual_h)
141        g_value = g_vertical;
142    else
143        g_value = (g_horizontal + g_vertical) / 2;
144    end
145end
146
147function residual = compute_laplacian_residual(bayer, i, j, g_candidate, laplacian_kernel, direction, pattern)
148% 计算拉普拉斯残差
149    [h, w] = size(bayer);
150    residual = 0;
151    
152    % 3x3邻域
153    neighborhood = zeros(3,3);
154    
155    for di = -1:1
156        for dj = -1:1
157            ni = i + di;
158            nj = j + dj;
159            if ni >= 1 && ni <= h && nj >= 1 && nj <= w
160                neighborhood(di+2, dj+2) = bayer(ni, nj);
161            end
162        end
163    end
164    
165    % 计算当前拉普拉斯值
166    current_laplacian = sum(sum(neighborhood .* laplacian_kernel));
167    
168    % 创建候选邻域
169    candidate_neighborhood = neighborhood;
170    candidate_neighborhood(2,2) = g_candidate; % 中心位置使用候选值
171    
172    % 计算候选拉普拉斯值
173    candidate_laplacian = sum(sum(candidate_neighborhood .* laplacian_kernel));
174    
175    % 残差为两者之差
176    residual = candidate_laplacian - current_laplacian;
177end
178
179function channel_interp = mlri_redblue_interpolation(bayer, pattern, G_interp, channel)
180% 基于MLRI的红色/蓝色通道插值
181    [h, w] = size(bayer);
182    
183    switch lower(channel)
184        case 'red'
185            base_channel = 'r';
186        case 'blue'
187            base_channel = 'b';
188    end
189    
190    [R, G, B] = extract_bayer_channels(bayer, pattern);
191    
192    if strcmpi(channel, 'red')
193        channel_data = R;
194    else
195        channel_data = B;
196    end
197    
198    channel_interp = channel_data;
199    laplacian_kernel = [0, 1, 0; 1, -4, 1; 0, 1, 0];
200    
201    % 在缺失位置插值
202    for i = 3:h-2
203        for j = 3:w-2
204            if channel_interp(i,j) == 0 % 需要插值的位置
205                % 使用颜色差值的恒常性假设
206                if strcmpi(channel, 'red')
207                    channel_interp(i,j) = interpolate_redblue_at_position(bayer, G_interp, i, j, laplacian_kernel, pattern, 'red');
208                else
209                    channel_interp(i,j) = interpolate_redblue_at_position(bayer, G_interp, i, j, laplacian_kernel, pattern, 'blue');
210                end
211            end
212        end
213    end
214    
215    channel_interp = handle_boundaries(channel_interp);
216end
217
218function value = interpolate_redblue_at_position(bayer, G_interp, i, j, laplacian_kernel, pattern, channel)
219% 在特定位置插值红色或蓝色通道
220    % 四个对角线方向候选
221    candidates = zeros(1,4);
222    residuals = zeros(1,4);
223    
224    % 对角线位置
225    positions = [-1,-1; -1,1; 1,-1; 1,1];
226    
227    for k = 1:4
228        di = positions(k,1);
229        dj = positions(k,2);
230        
231        % 获取相邻的同通道像素
232        if strcmpi(channel, 'red')
233            neighbor_val = get_red_value(bayer, pattern, i+di, j+dj);
234        else
235            neighbor_val = get_blue_value(bayer, pattern, i+di, j+dj);
236        end
237        
238        % 计算颜色差值
239        g_center = G_interp(i, j);
240        g_neighbor = G_interp(i+di, j+dj);
241        
242        % 候选值基于颜色差值恒常性
243        candidates(k) = neighbor_val + (g_center - g_neighbor);
244        
245        % 计算残差
246        residuals(k) = compute_color_difference_laplacian(bayer, G_interp, i, j, candidates(k), laplacian_kernel, channel, pattern);
247    end
248    
249    % 选择最小残差的候选
250    [~, min_idx] = min(abs(residuals));
251    value = candidates(min_idx);
252end
253
254function residual = compute_color_difference_laplacian(bayer, G_interp, i, j, candidate, laplacian_kernel, channel, pattern)
255% 计算颜色差值的拉普拉斯残差
256    [h, w] = size(bayer);
257    residual = 0;
258    
259    % 计算颜色差值
260    color_diff = zeros(3,3);
261    for di = -1:1
262        for dj = -1:1
263            ni = i + di;
264            nj = j + dj;
265            if ni >= 1 && ni <= h && nj >= 1 && nj <= w
266                if strcmpi(channel, 'red')
267                    channel_val = get_red_value(bayer, pattern, ni, nj);
268                else
269                    channel_val = get_blue_value(bayer, pattern, ni, nj);
270                end
271                
272                if channel_val == 0 && di == 0 && dj == 0
273                    % 中心位置使用候选值
274                    color_diff(di+2, dj+2) = candidate - G_interp(ni, nj);
275                elseif channel_val > 0
276                    color_diff(di+2, dj+2) = channel_val - G_interp(ni, nj);
277                else
278                    % 估计缺失的值
279                    color_diff(di+2, dj+2) = 0;
280                end
281            end
282        end
283    end
284    
285    % 计算拉普拉斯
286    laplacian_val = sum(sum(color_diff .* laplacian_kernel));
287    residual = abs(laplacian_val);
288end
289
290function value = get_red_value(bayer, pattern, i, j)
291% 获取红色通道值
292    [R, ~, ~] = extract_bayer_channels(bayer, pattern);
293    value = R(i, j);
294end
295
296function value = get_blue_value(bayer, pattern, i, j)
297% 获取蓝色通道值
298    [~, ~, B] = extract_bayer_channels(bayer, pattern);
299    value = B(i, j);
300end
301
302function image_out = handle_boundaries(image_in)
303% 边界处理
304    image_out = image_in;
305    [h, w] = size(image_in);
306    
307    % 复制边界像素
308    image_out(1,:) = image_out(2,:);
309    image_out(h,:) = image_out(h-1,:);
310    image_out(:,1) = image_out(:,2);
311    image_out(:,w) = image_out(:,w-1);
312    
313    % 角落像素
314    image_out(1,1) = image_out(2,2);
315    image_out(1,w) = image_out(2,w-1);
316    image_out(h,1) = image_out(h-1,2);
317    image_out(h,w) = image_out(h-1,w-1);
318end
319

高级改进版本

1function [rgb_image] = improved_mlri_demosaic(bayer_image, pattern)
2% 改进的MLRI去马赛克算法
3    if nargin < 2
4        pattern = 'rggb';
5    end
6    
7    % 预处理:噪声抑制
8    bayer_denoised = medfilt2(bayer_image, [3, 3]);
9    
10    % 主MLRI算法
11    rgb_initial = mlri_demosaic(bayer_denoised, pattern);
12    
13    % 后处理:伪彩色抑制
14    rgb_image = false_color_suppression(rgb_initial, bayer_denoised, pattern);
15    
16    % 边缘增强
17    rgb_image = edge_enhancement(rgb_image);
18end
19
20function rgb_out = false_color_suppression(rgb_in, bayer, pattern)
21% 伪彩色抑制
22    rgb_out = rgb_in;
23    [h, w, ~] = size(rgb_in);
24    
25    % 计算颜色梯度
26    for i = 2:h-1
27        for j = 2:w-1
28            % 检测边缘区域
29            edge_strength = compute_edge_strength(rgb_in, i, j);
30            
31            if edge_strength > 0.1 % 边缘区域
32                % 应用方向自适应滤波
33                rgb_out(i,j,:) = directional_filter(rgb_in, bayer, i, j, pattern);
34            end
35        end
36    end
37end
38
39function edge_strength = compute_edge_strength(rgb, i, j)
40% 计算边缘强度
41    g_channel = rgb(:,:,2); % 绿色通道通常有最好的边缘信息
42    
43    % Sobel算子
44    sobel_x = [-1, 0, 1; -2, 0, 2; -1, 0, 1];
45    sobel_y = [-1, -2, -1; 0, 0, 0; 1, 2, 1];
46    
47    patch = g_channel(i-1:i+1, j-1:j+1);
48    gx = sum(sum(patch .* sobel_x));
49    gy = sum(sum(patch .* sobel_y));
50    
51    edge_strength = sqrt(gx^2 + gy^2);
52end
53
54function filtered_pixel = directional_filter(rgb, bayer, i, j, pattern)
55% 方向自适应滤波
56    % 根据局部梯度方向选择滤波方向
57    g_channel = rgb(:,:,2);
58    
59    % 计算水平和垂直梯度
60    h_grad = abs(g_channel(i,j-1) - g_channel(i,j+1));
61    v_grad = abs(g_channel(i-1,j) - g_channel(i+1,j));
62    
63    if h_grad < v_grad
64        % 水平方向滤波
65        filtered_pixel = mean(rgb(i, j-1:j+1, :), 2);
66    else
67        % 垂直方向滤波
68        filtered_pixel = mean(rgb(i-1:i+1, j, :), 1);
69    end
70    
71    filtered_pixel = squeeze(filtered_pixel)';
72end
73
74function rgb_out = edge_enhancement(rgb_in)
75% 边缘增强
76    % 使用非锐化掩模
77    h = fspecial('gaussian', [5, 5], 1.0);
78    rgb_blur = imfilter(rgb_in, h, 'replicate');
79    
80    % 非锐化掩模
81    rgb_out = rgb_in + 0.6 * (rgb_in - rgb_blur);
82    rgb_out = min(max(rgb_out, 0), 1);
83end
84

性能评估函数

1function evaluate_demosaic(original_rgb, bayer_image, demosaiced_image, pattern)
2% 评估去马赛克算法性能
3    
4    % PSNR计算
5    mse = mean((original_rgb(:) - demosaiced_image(:)).^2);
6    psnr = 10 * log10(1 / mse);
7    
8    % SSIM计算
9    ssim_val = ssim(demosaiced_image, original_rgb);
10    
11    % 伪彩色指数计算
12    fci = compute_false_color_index(demosaiced_image);
13    
14    fprintf('性能评估结果:\n');
15    fprintf('PSNR: %.2f dB\n', psnr);
16    fprintf('SSIM: %.4f\n', ssim_val);
17    fprintf('伪彩色指数: %.4f\n', fci);
18    
19    % 可视化比较
20    figure('Position', [100, 100, 1200, 400]);
21    
22    subplot(1,3,1);
23    imshow(original_rgb);
24    title('原始图像');
25    
26    subplot(1,3,2);
27    bayer_display = repmat(bayer_image, [1, 1, 3]);
28    imshow(bayer_display);
29    title('Bayer模式图像');
30    
31    subplot(1,3,3);
32    imshow(demosaiced_image);
33    title('MLRI去马赛克结果');
34end
35
36function fci = compute_false_color_index(rgb_image)
37% 计算伪彩色指数
38    [h, w, ~] = size(rgb_image);
39    
40    % 计算颜色通道间的相关性
41    r_channel = rgb_image(:,:,1);
42    g_channel = rgb_image(:,:,2);
43    b_channel = rgb_image(:,:,3);
44    
45    % 高通滤波检测异常颜色变化
46    hp_filter = [-1, -1, -1; -1, 8, -1; -1, -1, -1] / 8;
47    
48    r_hp = imfilter(r_channel, hp_filter, 'replicate');
49    g_hp = imfilter(g_channel, hp_filter, 'replicate');
50    b_hp = imfilter(b_channel, hp_filter, 'replicate');
51    
52    % 伪彩色指数
53    fci = mean(abs(r_hp - g_hp) + abs(r_hp - b_hp) + abs(g_hp - b_hp), 'all');
54end
55

使用示例

1% 主测试程序
2function demo_mlri_demosaic()
3    % 生成测试图像或加载真实Bayer图像
4    original_rgb = im2double(imread('test_image.jpg'));
5    
6    % 转换为Bayer模式
7    bayer_image = rgb2bayer(original_rgb, 'rggb');
8    
9    % 应用MLRI去马赛克
10    tic;
11    demosaiced_image = improved_mlri_demosaic(bayer_image, 'rggb');
12    time_elapsed = toc;
13    
14    fprintf('MLRI去马赛克完成,耗时: %.2f秒\n', time_elapsed);
15    
16    % 性能评估
17    evaluate_demosaic(original_rgb, bayer_image, demosaiced_image, 'rggb');
18end
19
20function bayer = rgb2bayer(rgb, pattern)
21% 将RGB图像转换为Bayer模式
22    [h, w, ~] = size(rgb);
23    bayer = zeros(h, w);
24    
25    switch lower(pattern)
26        case 'rggb'
27            bayer(1:2:end, 1:2:end) = rgb(1:2:end, 1:2:end, 1); % R
28            bayer(1:2:end, 2:2:end) = rgb(1:2:end, 2:2:end, 2); % G
29            bayer(2:2:end, 1:2:end) = rgb(2:2:end, 1:2:end, 2); % G
30            bayer(2:2:end, 2:2:end) = rgb(2:2:end, 2:2:end, 3); % B
31    end
32end
33
34% 运行演示
35demo_mlri_demosaic();
36

算法优势

  1. 高质量的边缘保持:通过最小化拉普拉斯残差,在边缘区域选择最优插值方向
  2. 伪彩色抑制:基于颜色通道相关性的插值减少伪彩色 artifacts
  3. 计算效率:相比一些复杂方法,MLRI在质量和计算复杂度间取得良好平衡
  4. 适应性:可适应不同的Bayer模式

这种算法特别适合需要高质量图像恢复的数码摄影和计算机视觉应用。


基于最小拉普拉斯残差插值的去马赛克算法》 是转载文章,点击查看原文


相关推荐


LeetCode 热题 100——普通数组——最大子数组和
做怪小疯子2025/11/23

14.最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 示例 2: 输入:nums = [1] 输出:1 示例 3: 输入:nums = [5,4,-1,7,8] 输出:23 提示: 1 <= nums.length <= 105 -


全脑智能“破局者”诞生,黑芝麻智能SesameX™,重构具身智能新范式
高工智能汽车2025/11/22

当前,全球人工智能技术正在加速向“物理世界赋能”,智能汽车与机器人产业技术融合进入深水区,一场关乎“全脑智能”的产业革命已经悄然来临。 11月20日,全球车规级高性能AI芯片厂商黑芝麻智能举行「多维进化 智赋新生」机器人平台产品发布会,并发布多维具身智能计算平台——黑芝麻智能SesameX™,包含一整套从端侧模组到全脑智能的体系化计算平台。 据了解,黑芝麻智能SesameX多维具身智能计算平台是行业唯一符合车规安全的具身智能计算平台,亦是行业首个针对具身智能商业化部署的全栈计算平台,包含商用


MySQL中的字符集与排序规则
程序新视界2025/11/20

在MySQL中,当使用字符串类型时,有两方面的知识我们需要特别关注一下:字符集和排序规则。如果使用不当,则可能会导致性能问题或在插入数据时出现一些异常情况。 字符集定义了对应列允许使用的字符,而排序规则是用于比较这些字符的基础规则。通常,每个类型的字符集都会有多种排序规则,但一个排序规则只能属于一个字符集。 这篇文章,我们就围绕MySQL中字符集以及排序规则展开,详细聊聊相关的技术点。 MySQL中的字符集 MySQL支持广泛的字符集,包括GB2312、GBK、BIG5等本地字符集,以及多种Un


基于 Kafka 与时间轮实现高性能延迟消息
master_hl2025/11/19

1.整体链路 Kafka → RocksDB → SystemTimer → TimingWheel → Kafka public void sendDelay(long delayMs, String topic, String message) { try { DelayMessage delayMessage = new DelayMessage(delayMs, topic, message); rocksDB.put(delayMessage.g


Python 的内置函数 sum
IMPYLH2025/11/17

Python 内建函数列表 > Python 的内置函数 sum Python 的内置函数 sum() 是一个用于计算可迭代对象中所有元素之和的高效工具。这个函数可以接受一个可迭代对象(如列表、元组、集合等)作为参数,并返回其中所有元素的总和。 基本用法 numbers = [1, 2, 3, 4, 5] total = sum(numbers) # 返回 15 可选参数 sum() 函数还接受一个可选的第二个参数 start,用于指定求和的初始值。默认情况下 start 为 0。


ios包体积管理方案
denggun123452025/11/16

iOS 包体积优化是一个系统性的工程,需要从代码、资源、第三方库、构建配置等多个维度进行综合管理。下面我将梳理一个全面的 iOS 包体积管理方案。 一、包体积分析 在进行任何优化之前,必须先了解 App 体积到底由什么构成。 使用 Xcode 的 App Thinning Size Report 操作:Archive -> Distribute App -> App Store Connect -> 选择 Ad Hoc 或 App Store -> Next -> 在 "App T


Bash 入门
hubenchang05152025/11/15

#Bash 入门 #Hello World Bash 的内置命令 echo 可以打印文本。例如: $ echo Hello World Hello World echo 命令的 -e 选项激活转义字符的解释。例如: $ echo -e "Hello \n World" Hello World #命令格式 Bash 命令基本遵循以下格式: 命令 参数1 参数2 参数3 ... 例如在 echo Hello World 中,echo 是命令,Hello 是参数1,World 是参数2。 而


Python 的内置函数 issubclass
IMPYLH2025/11/14

Python 内建函数列表 > Python 的内置函数 issubclass Python 的内置函数 issubclass 用于检查一个类是否是另一个类的子类(直接或间接继承)。它是 Python 面向对象编程中类型检查的重要工具。 语法 issubclass(class, classinfo) 参数说明 class:需要检查的类(必须是类对象,不能是实例)classinfo:可以是一个类对象,或者由类对象组成的元组 返回值 返回布尔值: True:如果 class 是 c


Flutter 3.38 发布,快来看看有什么更新吧
恋猫de小郭2025/11/13

在 11 月 13 日的 FlutterFlightPlans 直播中,Flutter 3.38 如期而至,本次版本主要涉及 Dot shorthands、Web 支持增强、性能改进、问题修复和控件预览等方面。 Dot shorthands 在 Dart 3.10 + Flutter 3.38 中开始默认支持 Dot shorthands ,通过 Dot shorthands 可以使用简写方式省略类型前缀,例如使用 .start 而不是 MainAxisAlignment.start : /


HTML 的 <canvas> 标签
hubenchang05152025/11/11

#HTML 的 <canvas> 标签 请查看 HTML 元素帮助手册 了解更多 HTML 元素。 <canvas> 元素可被用来通过 JavaScript(Canvas API 或 WebGL API)绘制图形及图形动画。 #属性 请查看 HTML 元素的全局属性 了解 HTML 元素的全局属性。 height: 该元素占用空间的高度,以 CSS 像素(px)表示,默认为 150。 moz-opaque(废弃): 通过设置这个属性,来控制 canvas 元素是否半透明。如果你不想 c

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读