2 Star 0 Fork 0

oreomaker/bmp-lsb

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
encode_noise.py 2.83 KB
一键复制 编辑 原始数据 按行查看 历史
jimmyss 提交于 2023-06-27 16:22 . 帮郭老师推一下
import random
import struct
# 打开bmp文件
with open('example.bmp', 'rb') as f:
# 读取文件头信息
bmp_header = f.read(54) # BMP文件头长度为54字节
# 解析bmp文件头信息
magic_num, size, _, _, offset = struct.unpack_from("<2sIHHI", bmp_header)
# 输出图像信息
print(f"Magic number: {magic_num.decode()}")
print(f"File size: {size} bytes")
print(f"Image data offset: {offset} bytes")
# 解析位图信息头长度
info_header_length = struct.unpack_from("<I", bmp_header, offset=14)[0]
# 判断图像类型
if info_header_length == 40:
planes, bit_count = struct.unpack_from("<HH", bmp_header, offset=26)
if planes == 1 and bit_count == 8:
print("Image type: 256灰度图")
elif planes == 1 and bit_count == 24:
print("Image type: 24位真彩图")
else:
print("Unknown image type")
else:
print("Unsupported BMP format")
# 获取图像宽度和高度
width, height = struct.unpack_from("<ii", bmp_header, offset=18)
# 判断图像大小是否小于512x512像素
if width > 512 or height > 512:
print("图像大小大于512x512像素")
else:
print(f"图像大小为 {width}x{height} 像素")
# 读取图像数据
f.seek(offset) # 定位到图像数据的开始位置
data = f.read()
# 定义一个函数,将数据写入LSB中
def write_lsb(byte, bit):
# 将字节的最后一位设置为指定的比特
return (byte & 0xFE) | bit
# 从txt文件中读取要加密的内容并进行处理
with open('message.txt', 'r') as message_file:
content = message_file.read().strip() # 读取文件内容并去除首尾空白字符
# 重复内容并添加零
content_with_zeros = ''
for _ in range(1000):
content_with_zeros += content + '.' * 10
# 将需要隐藏的数据转换为比特流
message_bytes = content_with_zeros.encode('utf-8')
# 将数据写入到图像数据中
bit_index = 0
for i, byte in enumerate(data):
if bit_index >= len(message_bytes) * 8 or i >= len(data):
# 数据已经写满,退出循环
break
# 从要写入的字节中读取比特
bit = (message_bytes[bit_index // 8] >> (bit_index % 8)) & 0x01
# 将比特写入到当前字节的LSB中
data = data[:i] + bytes([write_lsb(byte, bit)]) + data[i+1:]
bit_index += 1
# 获取图像像素数据的起始位置
pixel_data_offset = offset
# 添加噪声到图像像素数据中
for i in range(pixel_data_offset, len(data)):
# 根据概率决定是否进行异或操作
if random.random() < 0.05:
# 对第 i 个字节进行异或操作
data = data[:i] + bytes([data[i] ^ random.randint(0, 255)]) + data[i+1:]
# 将修改后的图像数据写入新的bmp文件
with open('example_noise.bmp', 'wb') as f:
f.write(bmp_header + data)
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/oreomaker/bmp-lsb.git
git@gitee.com:oreomaker/bmp-lsb.git
oreomaker
bmp-lsb
bmp-lsb
main

搜索帮助