phython实现lsb算法代码
时间: 2023-09-03 18:16:30 浏览: 256
以下是Python实现LSB算法的代码示例:
```python
from PIL import Image
def hide_data(image_path, data):
# 打开图像
image = Image.open(image_path)
# 将数据转换为二进制字符串,每个字符占8位
binary_data = ''.join(format(ord(char), '08b') for char in data)
# 获取图像的像素列表
pixels = list(image.getdata())
# 检查数据是否太大,超过最大容量则返回
max_size = len(pixels) * 3 // 8
if len(binary_data) > max_size:
return 'Error: Data is too large to hide in the given image.'
# 将数据插入到像素LSB中
binary_data += '0' * (max_size - len(binary_data))
new_pixels = []
index = 0
for pixel in pixels:
# 将像素的每个通道转换为二进制字符串
r, g, b = [format(value, '08b') for value in pixel]
# 替换R通道的最低有效位
r = r[:-1] + binary_data[index]
index += 1
# 替换G通道的最低有效位
if index < len(binary_data):
g = g[:-1] + binary_data[index]
index += 1
# 替换B通道的最低有效位
if index < len(binary_data):
b = b[:-1] + binary_data[index]
index += 1
# 将修改后的像素添加到新像素列表中
new_pixels.append((int(r, 2), int(g, 2), int(b, 2)))
# 检查是否所有数据都已写入
if index >= len(binary_data):
break
# 创建新图像并保存
new_image = Image.new(image.mode, image.size)
new_image.putdata(new_pixels)
new_image.save('new_' + image_path)
return 'Data hidden successfully.'
def extract_data(image_path):
# 打开图像
image = Image.open(image_path)
# 获取图像的像素列表
pixels = list(image.getdata())
binary_data = ''
for pixel in pixels:
# 将像素的每个通道转换为二进制字符串
r, g, b = [format(value, '08b') for value in pixel]
# 提取R通道的最低有效位
binary_data += r[-1]
# 提取G通道的最低有效位
binary_data += g[-1]
# 提取B通道的最低有效位
binary_data += b[-1]
# 将二进制字符串转换为原始数据字符串
data = ''
for i in range(0, len(binary_data), 8):
byte = binary_data[i:i+8]
data += chr(int(byte, 2))
return data
```
使用示例:
```python
# 将数据隐藏到图像中
hide_data('image.png', 'Hello, world!')
# 从图像中提取数据
data = extract_data('new_image.png')
print(data) # 输出:Hello, world!
```
注意:此代码示例仅支持使用RGB图像隐藏文本数据。如果您使用的是带有Alpha通道的图像,则需要修改代码以处理Alpha通道。此外,如果您需要隐藏的数据不是文本,则需要修改代码以处理不同类型的数据。
阅读全文