Python |GIF 解析与构建(3):简单哈希压缩256色算法
Python |GIF 解析与构建(3):简单哈希压缩256色算法
目录
Python |GIF 解析与构建(3):简单哈希压缩256色算法
一、算法性能表现
二、算法核心原理与实现
(一)简单哈希算法逻辑
1. 颜色分量压缩
2. 加权灰度值计算
3. 旋转哈希生成
(二)图像压缩流程
三、图像质量评估实现
(一)PSNR 计算
(二)SSIM 计算
四、算法优缺点与应用场景
(一)优势
(二)局限性
(三)适用场景
五、总结与改进方向
在图像处理领域,压缩算法的效率与效果始终是研究的核心方向之一。本文将聚焦于一种适用于 256 色 GIF 的简单哈希压缩算法,通过实际案例分析其压缩性能、技术实现及应用场景。
一、算法性能表现
该算法在不同尺寸、类型的图像上在同类的算法之中展现出了中游水平的压缩能力和处理图像质量能力,在GIF256色压缩可以很容易的构建出来,以下是具体测试数据:
图像类型 | 原始尺寸 | 原始大小 | 压缩后大小 | 压缩率 | PSNR(dB) | SSIM |
---|---|---|---|---|---|---|
900P 全屏截图 | 1600×900 | 740KB | 224KB | 69.73% | 24.48 | 0.8358 |
900P 全屏截图 | 1600×900 | 477KB | 238KB | 50.1% | 24.83 | 0.8997 |
小型图片 | 300×160 | 39KB | 7KB | 82.05% | 27.98 | 0.8877 |
任务栏截图 | 1260×40 | 27KB | 13KB | 51.8% | 25.10 | 0.9448 |
关键指标说明:
- 压缩率:文件体积缩减比例,数值越高表示压缩效果越显著(如小型图片压缩率达 82.05%)。
- PSNR(峰值信噪比):衡量图像失真程度,数值越高表示画质保留越好(任务栏截图 PSNR 为 25.10dB,接近人眼可接受范围)。
- SSIM(结构相似性):评估图像结构相似度,取值越接近 1 表示画质越接近原图(任务栏截图 SSIM 达 0.9448,视觉效果接近无损)。
二、算法核心原理与实现
(一)简单哈希算法逻辑
1. 颜色分量压缩
通过右移操作降低颜色精度:
def shift_bytes_data(data):return bytes(c >> 5 for c in data) # 将RGB各分量从8位压缩为3位(0-7)
原理:利用人眼对颜色细节敏感度较低的特性,通过舍弃低位数据减少颜色数量。
2. 加权灰度值计算
结合人眼对 RGB 三通道的敏感度差异(绿光 > 红光 > 蓝光):
r, g, b = data[0], data[1], data[2]
weighted_sum = (r * 299 + g * 587 + b * 114) // 1000 # 近似计算亮度值
作用:将彩色信息转化为亮度特征,为哈希值提供感知层面的鲁棒性。
3. 旋转哈希生成
通过位移与异或运算增强哈希值的扩散性:
rotated_hash = ((r << 5) ^ g ^ (b >> 3)) & 0xFF # 混合RGB分量并限制值域
hash_value = (weighted_sum + rotated_hash) & 0xFF # 合并亮度与色彩特征
优势:减少哈希冲突概率,确保相似颜色生成不同哈希值。
(二)图像压缩流程
-
像素数据处理:
将图像转换为 RGB 模式,提取像素列表:with Image.open("1.png").convert('RGB') as img:pixels = list(img.getdata()) # 获取所有像素的(R, G, B)元组
-
哈希映射构建:
对每个像素生成哈希值,统计唯一哈希数量(即压缩后颜色数):image_set = set([simple_hash_unrolled(bytes(i)) for i in pixels]) print("压缩数量:", len(image_set)) # 输出唯一哈希值总数
-
颜色映射与重建:
创建哈希值到原始颜色的映射表,用映射颜色重建图像:hash_map = {key: pixels[image_hash.index(s)] for key in image_set} # 记录每个哈希对应的原始颜色 new_image = [hash_map.get(x, x) for x in image_hash] # 用映射颜色替换像素值
三、图像质量评估实现
(一)PSNR 计算
基于均方误差(MSE)评估像素级差异:
def calculate_psnr(original_img, compressed_img):original = np.array(original_img).astype(np.float64)compressed = np.array(compressed_img).astype(np.float64)mse = np.mean((original - compressed) ** 2)return 20 * np.log10(255.0 / np.sqrt(mse)) # 假设像素值范围0-255
(二)SSIM 计算
从亮度、对比度、结构三方面评估图像相似性:
def calculate_ssim(original_img, compressed_img):original = np.array(original_img)compressed = np.array(compressed_img)if len(original.shape) == 3: # 彩色图像分通道计算return np.mean([ssim(original[:, :, i], compressed[:, :, i], data_range=255) for i in range(3)])else: # 灰度图像直接计算return ssim(original, compressed, data_range=255)
四、算法优缺点与应用场景
(一)优势
- 速度快:压缩耗时约 5 秒(针对 1600×900 图像),适合实时或批量处理。
- 实现简单:无需复杂数学变换,仅通过位运算和哈希映射完成压缩。
- 适应性强:在文字图标(如任务栏)、大面积单色区域图像中表现优异(SSIM>0.9)。
(二)局限性
- 颜色损失明显:在高色彩丰富度图像中(如自然风景),压缩后可能出现色块化。
- 压缩率波动大:依赖图像内容,复杂图像压缩率较低(约 50%)。
(三)适用场景
- UI 界面截图:任务栏、菜单等含大量纯色或重复图案的场景。
- 简单图标 / 图形:LOGO、线条图等对色彩精度要求不高的图像。
- 低带宽传输:需要快速压缩传输的简单图像场景(如嵌入式设备)。
五、总结与改进方向
该简单哈希算法为 256 色 GIF 压缩提供了一种轻量级解决方案,平衡了压缩效率与实现复杂度。未来可通过以下方式优化:
- 动态颜色量化:结合 K-means 等聚类算法,自适应选择最优颜色子集。
- 哈希函数优化:引入更复杂的哈希算法(如感知哈希),提升相似颜色区分度。
- 分块处理:对图像分区域应用不同压缩策略,保留高细节区域的色彩精度。
代码如下:
import os from PIL import Image""" 此算法压缩256色在gif使用的算法中属于中游 尺寸: 1600x900 PSNR: 24.45 dB SSIM: 0.8676 原始: 666.91KB | 压缩后: 284.01KB | 压缩率: 57.41%尺寸: 1600x900 PSNR: 26.44 dB SSIM: 0.9225 原始: 434.13KB | 压缩后: 219.29KB | 压缩率: 49.49%尺寸: 300x160 PSNR: 34.48 dB SSIM: 0.8587 原始: 32.36KB | 压缩后: 9.47KB | 压缩率: 70.75%尺寸: 690x300 PSNR: 23.46 dB SSIM: 0.9106 原始: 106.14KB | 压缩后: 71.28KB | 压缩率: 32.84%尺寸: 480x480 PSNR: 29.43 dB SSIM: 0.6616 原始: 107.20KB | 压缩后: 17.50KB | 压缩率: 83.67% """# 简单哈希 def simple_hash_unrolled(data):# 通过右移来实现对细节的颜色进行进一步压缩def shift_bytes_data(data):return bytes(c >> 5 for c in data)data = shift_bytes_data(data)# 提取RGB分量r, g, b = data[0], data[1], data[2]# 人眼敏感度计算weighted_sum = (r * 299 + g * 587 + b * 114) // 1000# 旋转哈希:结合位移和异或运算,扩散哈希值分布rotated_hash = ((r << 5) ^ g ^ (b >> 3)) & 0xFF# 亮度brightness_component = max(r, g, b) & 0xFF# 计算哈希hash_value = (weighted_sum + rotated_hash + brightness_component) & 0xFFreturn hash_value# 简单压缩 def rgb332_hash(data):r = data[0] >> 5 # 3 bits (0-7)g = data[1] >> 5 # 3 bits (0-7)b = data[2] >> 6 # 2 bits (0-3)return (r << 5) | (g << 2) | b# 亮度 def perceptual_hash(data):# 转换到YUV空间,提取亮度(更符合人眼敏感度)y = (data[0] * 299 + data[1] * 587 + data[2] * 114) // 1000# 结合色度简化u = data[1] >> 5 # 3-bitv = data[2] >> 5 # 3-bitreturn (y & 0xF8) | (u >> 2) | (v << 3)# 换位 def enhanced_rotated_hash(data):r, g, b = data[0] >> 4, data[1] >> 4, data[2] >> 4 # 4-bit压缩# 多重异或+位移扩散hash_r = (r << 4) ^ (g << 2) ^ bhash_g = (g << 4) ^ (b << 2) ^ rhash_b = (b << 4) ^ (r << 2) ^ greturn (hash_r + hash_g * 3 + hash_b * 5) & 0xFF# 简单哈希法 with Image.open("1.png").convert('RGB') as img:width, height = img.sizepixels = list(img.getdata())print(f"尺寸: {width}x{height}")print(f"像素数据: {pixels[:10]} ...")image_set = set([simple_hash_unrolled(bytes(i)) for i in pixels]) print("压缩数量:", len(image_set)) print("压缩哈希:", image_set) image_hash = [simple_hash_unrolled(bytes(i)) for i in pixels]hash_map = {key: (0, 0, 0) for key in image_set} # 全部哈希遍历映射字典 for s in image_set:hash_map[s] = pixels[image_hash.index(s)] # 字典赋值new_image = [hash_map.get(x, x) for x in image_hash] # RGB模式 new_img = Image.new('RGB', (width, height)) # 按行填充 new_img.putdata(new_image) # 保存为PNG文件 new_img.save('2.png', 'PNG')import numpy as np from skimage.metrics import structural_similarity as ssimdef calculate_psnr(original_img: Image.Image, compressed_img: Image.Image) -> float:"""计算两张图像之间的PSNR值"""# 将图像转换为NumPy数组original = np.array(original_img).astype(np.float64)compressed = np.array(compressed_img).astype(np.float64)# 确保图像尺寸相同if original.shape != compressed.shape:raise ValueError("两张图像的尺寸必须相同")# 计算MSE(均方误差)mse = np.mean((original - compressed) ** 2)# 避免除零错误if mse == 0:return float('inf')# 计算PSNR(假设像素值范围为0-255)max_pixel = 255.0psnr = 20 * np.log10(max_pixel / np.sqrt(mse))return psnrdef calculate_ssim(original_img: Image.Image, compressed_img: Image.Image) -> float:"""计算两张图像之间的SSIM值"""# 将图像转换为NumPy数组original = np.array(original_img).astype(np.float64)compressed = np.array(compressed_img).astype(np.float64)# 确保图像尺寸相同if original.shape != compressed.shape:raise ValueError("两张图像的尺寸必须相同")# 如果是彩色图像,分别计算每个通道的SSIM并取平均if len(original.shape) == 3 and original.shape[2] == 3: # RGB图像ssim_values = []for i in range(3): # 分别计算R、G、B通道ssim_val = ssim(original[:, :, i], compressed[:, :, i],data_range=compressed[:, :, i].max() - compressed[:, :, i].min())ssim_values.append(ssim_val)return np.mean(ssim_values)else: # 灰度图像return ssim(original, compressed,data_range=compressed.max() - compressed.min())# 加载图像 original = Image.open("1.png").convert("RGB") compressed = Image.open("2.png").convert("RGB")# 计算PSNR和SSIM psnr_value = calculate_psnr(original, compressed) ssim_value = calculate_ssim(original, compressed)print(f"PSNR: {psnr_value:.2f} dB") print(f"SSIM: {ssim_value:.4f}")# 替换为你的图片路径 original = "1.png" compressed = "2.png" # 获取文件大小(KB) o_size = os.path.getsize(original) / 1024 c_size = os.path.getsize(compressed) / 1024 # 计算并打印压缩率 ratio = (1 - c_size / o_size) * 100 print(f"原始: {o_size:.2f}KB | 压缩后: {c_size:.2f}KB | 压缩率: {ratio:.2f}%")
import os
from PIL import Image"""
此算法压缩256色在gif使用的算法中属于中游
尺寸: 1600x900
PSNR: 24.45 dB
SSIM: 0.8676
原始: 666.91KB | 压缩后: 284.01KB | 压缩率: 57.41%尺寸: 1600x900
PSNR: 26.44 dB
SSIM: 0.9225
原始: 434.13KB | 压缩后: 219.29KB | 压缩率: 49.49%尺寸: 300x160
PSNR: 34.48 dB
SSIM: 0.8587
原始: 32.36KB | 压缩后: 9.47KB | 压缩率: 70.75%尺寸: 690x300
PSNR: 23.46 dB
SSIM: 0.9106
原始: 106.14KB | 压缩后: 71.28KB | 压缩率: 32.84%尺寸: 480x480
PSNR: 29.43 dB
SSIM: 0.6616
原始: 107.20KB | 压缩后: 17.50KB | 压缩率: 83.67%
"""# 简单哈希
def simple_hash_unrolled(data):# 通过右移来实现对细节的颜色进行进一步压缩def shift_bytes_data(data):return bytes(c >> 5 for c in data)data = shift_bytes_data(data)# 提取RGB分量r, g, b = data[0], data[1], data[2]# 人眼敏感度计算weighted_sum = (r * 299 + g * 587 + b * 114) // 1000# 旋转哈希:结合位移和异或运算,扩散哈希值分布rotated_hash = ((r << 5) ^ g ^ (b >> 3)) & 0xFF# 亮度brightness_component = max(r, g, b) & 0xFF# 计算哈希hash_value = (weighted_sum + rotated_hash + brightness_component) & 0xFFreturn hash_value# 简单压缩
def rgb332_hash(data):r = data[0] >> 5 # 3 bits (0-7)g = data[1] >> 5 # 3 bits (0-7)b = data[2] >> 6 # 2 bits (0-3)return (r << 5) | (g << 2) | b# 亮度
def perceptual_hash(data):# 转换到YUV空间,提取亮度(更符合人眼敏感度)y = (data[0] * 299 + data[1] * 587 + data[2] * 114) // 1000# 结合色度简化u = data[1] >> 5 # 3-bitv = data[2] >> 5 # 3-bitreturn (y & 0xF8) | (u >> 2) | (v << 3)# 换位
def enhanced_rotated_hash(data):r, g, b = data[0] >> 4, data[1] >> 4, data[2] >> 4 # 4-bit压缩# 多重异或+位移扩散hash_r = (r << 4) ^ (g << 2) ^ bhash_g = (g << 4) ^ (b << 2) ^ rhash_b = (b << 4) ^ (r << 2) ^ greturn (hash_r + hash_g * 3 + hash_b * 5) & 0xFF# 简单哈希法
with Image.open("1.png").convert('RGB') as img:width, height = img.sizepixels = list(img.getdata())print(f"尺寸: {width}x{height}")print(f"像素数据: {pixels[:10]} ...")image_set = set([simple_hash_unrolled(bytes(i)) for i in pixels])
print("压缩数量:", len(image_set))
print("压缩哈希:", image_set)
image_hash = [simple_hash_unrolled(bytes(i)) for i in pixels]hash_map = {key: (0, 0, 0) for key in image_set}
# 全部哈希遍历映射字典
for s in image_set:hash_map[s] = pixels[image_hash.index(s)] # 字典赋值new_image = [hash_map.get(x, x) for x in image_hash]
# RGB模式
new_img = Image.new('RGB', (width, height))
# 按行填充
new_img.putdata(new_image)
# 保存为PNG文件
new_img.save('2.png', 'PNG')import numpy as np
from skimage.metrics import structural_similarity as ssimdef calculate_psnr(original_img: Image.Image, compressed_img: Image.Image) -> float:"""计算两张图像之间的PSNR值"""# 将图像转换为NumPy数组original = np.array(original_img).astype(np.float64)compressed = np.array(compressed_img).astype(np.float64)# 确保图像尺寸相同if original.shape != compressed.shape:raise ValueError("两张图像的尺寸必须相同")# 计算MSE(均方误差)mse = np.mean((original - compressed) ** 2)# 避免除零错误if mse == 0:return float('inf')# 计算PSNR(假设像素值范围为0-255)max_pixel = 255.0psnr = 20 * np.log10(max_pixel / np.sqrt(mse))return psnrdef calculate_ssim(original_img: Image.Image, compressed_img: Image.Image) -> float:"""计算两张图像之间的SSIM值"""# 将图像转换为NumPy数组original = np.array(original_img).astype(np.float64)compressed = np.array(compressed_img).astype(np.float64)# 确保图像尺寸相同if original.shape != compressed.shape:raise ValueError("两张图像的尺寸必须相同")# 如果是彩色图像,分别计算每个通道的SSIM并取平均if len(original.shape) == 3 and original.shape[2] == 3: # RGB图像ssim_values = []for i in range(3): # 分别计算R、G、B通道ssim_val = ssim(original[:, :, i], compressed[:, :, i],data_range=compressed[:, :, i].max() - compressed[:, :, i].min())ssim_values.append(ssim_val)return np.mean(ssim_values)else: # 灰度图像return ssim(original, compressed,data_range=compressed.max() - compressed.min())# 加载图像
original = Image.open("1.png").convert("RGB")
compressed = Image.open("2.png").convert("RGB")# 计算PSNR和SSIM
psnr_value = calculate_psnr(original, compressed)
ssim_value = calculate_ssim(original, compressed)print(f"PSNR: {psnr_value:.2f} dB")
print(f"SSIM: {ssim_value:.4f}")# 替换为你的图片路径
original = "1.png"
compressed = "2.png"
# 获取文件大小(KB)
o_size = os.path.getsize(original) / 1024
c_size = os.path.getsize(compressed) / 1024
# 计算并打印压缩率
ratio = (1 - c_size / o_size) * 100
print(f"原始: {o_size:.2f}KB | 压缩后: {c_size:.2f}KB | 压缩率: {ratio:.2f}%")
相关文章:
Python |GIF 解析与构建(3):简单哈希压缩256色算法
Python |GIF 解析与构建(3):简单哈希压缩256色算法 目录 Python |GIF 解析与构建(3):简单哈希压缩256色算法 一、算法性能表现 二、算法核心原理与实现 (一…...
蓝桥杯2114 李白打酒加强版
问题描述 话说大诗人李白, 一生好饮。幸好他从不开车。 一天, 他提着酒显, 从家里出来, 酒显中有酒 2 斗。他边走边唱: 无事街上走,提显去打酒。 逢店加一倍, 遇花喝一斗。 这一路上, 他一共遇到店 N 次, 遇到花 M 次。已知最后一次遇到的是花, 他正好把酒喝光了。…...

基本数据指针的解读-C++
1、引言 笔者认为对于学习指针要弄清楚如下问题基本可以应付大部分的场景: ① 指针是什么? ② 指针的类型是什么? ③ 指针指向的类型是什么? ④ 指针指向了哪里? 2、如何使用指针 使用时的步骤如下: ① …...
Android Studio里的BLE数据接收策略
#本人是初次接触Android蓝牙开发,若有不对地方,欢迎指出。 #由于是讲接收数据策略(其中还包含数据发送的部分策略),因此其他问题部分不会讲述,只描述数据接收。 简介(对于客户端---手机端) 博主在处理数据接收的时候࿰…...
【Office】Excel两列数据比较方法总结
在Excel中,比较两列数据是否相等有多种方法,以下是常用的几种方式: 方法1:使用公式(返回TRUE/FALSE) 在空白列(如C列)输入公式,向下填充即可逐行比较两列(如…...

基于多模态脑电、音频与视觉信号的情感识别算法【Nature核心期刊,EAV:EEG-音频-视频数据集】
简述 理解情感状态对于开发下一代人机交互界面至关重要。社交互动中的人类行为会引发受感知输入影响的心理生理过程。因此,探索大脑功能与人类行为的努力或将推动具有类人特质人工智能模型的发展。这里原作者推出一个多模态情感数据集,包含42名参与者的3…...

【QueryServer】dbeaver使用phoenix连接Hbase(轻客户端方式)
一、轻客户端连接方式 (推荐) 演示无认证配置方式, 有认证填入下方有认证参数即可 1, 新建连接 → Hadoop/大数据 → Apache Phoenix 2, 手动配置QueryServer驱动: 填入: “类名”, “URL模版”(注意区分有无认证), “端口号”, (勾选无认证) 类名: org.apache.phoenix…...
数据湖 (特点+与数据仓库和数据沼泽的对比讲解)
数据湖就像一个“数据水库”,把企业所有原始数据(结构化的表格、半结构化的日志、非结构化的图片/视频)原样存储,供后续按需分析。 对比传统数据仓库: 数据仓库数据湖数据清洗后的结构化数据(如Excel表格&…...
深入链表剖析:从原理到 C 语言实现,涵盖单向、双向及循环链表全解析
1 引言 在数据结构的学习中,链表是一种基础且极为重要的线性数据结构。与数组不同,链表通过指针将一系列节点连接起来,每个节点包含数据域和指向下一个节点的指针域。这种动态的存储方式使得链表在插入、删除等操作上具有独特的优势。本文将深…...
编码总结如下
VS2019一般的编码是UTF-8编码, win11操作系统的编码可能为GB2312,VS整个工程中使用的都是UTF-8编码,但是在系统内生成的其他文件夹的名字则是系统的编码 如何选择? Qt 项目:优先用 QString 和 QByteArray(…...
《算力觉醒!ONNX Runtime + DirectML如何点燃Windows ARM设备的AI引擎》
ONNX Runtime是一个跨平台的高性能推理引擎,它就像是一位精通多种语言的翻译官,能够无缝运行来自不同深度学习框架转化为ONNX格式的模型。这种兼容性打破了框架之间的隔阂,让开发者可以将更多的精力投入到模型的优化和应用中。 从内部机制来…...

[9-1] USART串口协议 江协科技学习笔记(13个知识点)
1 2 3 4全双工就是两个数据线,半双工就是一个数据线 5 6 7 8 9 10 TTL(Transistor-Transistor Logic)电平是一种数字电路中常用的电平标准,它使用晶体管来表示逻辑状态。TTL电平通常指的是5V逻辑电平,其中:…...

Oracle基础知识(五)——ROWID ROWNUM
目录 一、ROWID 伪列 二、ROWNUM——限制查询结果集行数 1.ROWNUM使用介绍 2.使用ROWNUM进行分页查询 3.使用ROWNUM查看薪资前五位的员工 4.查询指定条数直接的数据 三、ROWNUM与ROWID不同 一、ROWID 伪列 表中的每一行在数据文件中都有一个物理地址,ROWID…...
简述synchronized和java.util.concurrent.locks.Lock的异同 ?
主要相同点: Lock能完成synchronized所实现的所有功能。 主要不同点: Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放Lock还有更强大…...
OpenCV CUDA模块直方图计算------在 GPU 上计算图像直方图的函数calcHist()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 OpenCV 的 CUDA 模块 中用于在 GPU 上计算图像直方图的一个函数。 计算单通道 8-bit 图像的灰度直方图(Histogram)。 该函…...

EMS只是快递那个EMS吗?它跟能源有什么关系?
在刚刚落幕的深圳人工智能终端展上,不少企业展示了与数字能源相关的技术和服务,其中一项关键系统——EMS(Energy Management System,能量管理系统)频频亮相。这个看似低调的名字,实际上正悄然成为未来能源管…...

日志技术-LogBack、Logback快速入门、Logback配置文件、Logback日志级别
一. 日志技术 1. 程序中的日志,是用来记录应用程序的运行信息、状态信息、错误信息等。 2. JUL:(java.util.logging)这是JavaSE平台提供的官方日志框架,也被称为JUL。配置相对简单,但不够灵活,性能较差。 3.Logs4j&…...

修改Cinnamon主题
~/.themes/Brunnera-Dark/cinnamon/cinnamon.css 1.修改 Tooltip 圆角大小,边框颜色,背景透明度 #Tooltip { border-radius: 10px; color: rgba(255, 255, 255, 0.8); border: 1px solid rgba(255, 255, 255, 0.6); background-color: rgba(0,…...

91.评论日记
2025年5月30日20:27:06 AI画减速器图纸? 呜呜为什么读到机械博士毕业了才有啊 | 新迪数字2025新品发布会 | AI工业软件 | 三维CAD | 国产自主_哔哩哔哩_bilibili...

HTML5实现简洁的端午节节日网站源码
HTML5实现简洁的端午节节日网站源码 前言一、设计来源1.1 网站首页界面1.2 端午由来界面1.3 节日活动界面1.4 传统美食界面1.5 民俗文化界面1.6 登录界面1.7 注册界面 二、效果和源码2.1 动态效果2.2 源代码 结束语 HTML5实现简洁的端午节节日网站源码,酷炫的大气简…...

Window10+ 安装 go环境
一、 下载 golang 源码: 去官网下载: https://go.dev/dl/ ,当前时间(2025-05)最新版本如下: 二、 首先在指定的磁盘下创建几个文件夹 比如在 E盘创建 software 文件夹 E:\SoftWare,然后在创建如下几个文件夹 E:\S…...
AWS WebRTC:获取ICE服务地址(part 2): ICE Agent的作用
上一篇,已经获取到了ICE服务地址,从返回结果中看,是两组TURN服务地址。 拿到这些地址有什么用呢?接下来就要说到WebRTC中ICE Agent的作用了,返回的服务地址会传给WebRTC最终给到ICE Agent。 ICE Agent的作用…...

一、Sqoop历史发展及原理
作者:IvanCodes 日期:2025年5月30日 专栏:Sqoop教程 在大数据时代,数据往往分散存储在各种不同类型的系统中。其中,传统的关系型数据库 (RDBMS) 如 MySQL, Oracle, PostgreSQL 等,仍然承载着大量的关键业务…...

React 编译器 RC
🤖 作者简介:水煮白菜王,一位前端劝退师 👻 👀 文章专栏: 前端专栏 ,记录一下平时在博客写作中,总结出的一些开发技巧和知识归纳总结✍。 感谢支持💕💕&#…...
PyTorch 中mm和bmm函数的使用详解
torch.mm 是 PyTorch 中用于 二维矩阵乘法(matrix-matrix multiplication) 的函数,等价于数学中的 A B 矩阵乘积。 一、函数定义 torch.mm(input, mat2) → Tensor执行的是两个 2D Tensor(矩阵)的标准矩阵乘法。 in…...

关于表连接
目录 1.左连接 2.右连接 3.内连接 4.全外连接 5.笛卡尔积 -- 创建表A CREATE TABLE A(PNO VARCHAR2(10) PRIMARY KEY, PAMT NUMBER, A_DATE DATE);-- 向表A插入数据 INSERT INTO A VALUES (01001, 100, TO_DATE(2005-01-01, YYYY-MM-DD)); INSERT INTO A VALUES (010…...

【计算机网络】fork()+exec()创建新进程(僵尸进程及孤儿进程)
文章目录 一、基本概念1. fork() 系统调用2. exec() 系列函数 二、典型使用场景1. 创建子进程执行新程序2. 父子进程执行不同代码 三、核心区别与注意事项四、组合使用技巧1. 重定向子进程的输入/输出2. 创建多级子进程 五、常见问题与解决方案僵尸进程(Zombie Proc…...
QPS 和 TPS 详解
QPS 和 TPS 是性能测试中的两个核心指标,用于衡量系统的吞吐能力,但关注点不同。以下是具体解析: 1. QPS(Queries Per Second) 定义:每秒查询数,表示系统每秒能处理的请求数量(无论…...

Word表格怎样插入自动序号或编号
在Word文档中编辑表格时,经常需要为表格添加序号或编号,可以设置为自动序号或编号,当删除行时,编号会自动变化,不用手工再重新编号。如图所示。 序号数据1数据21300300230030033003004300300 一,建立word表…...
数据结构:导论
目录 什么是“第一性原理”? 什么是“数据结构”? 数据结构解决的根本问题是什么? 数据结构的两大分类 数据结构的基本操作 数据结构与算法的关系 学习数据结构的底层目标 什么是“第一性原理”? 在正式进入数据结构之前&…...