0%

PowerShell 编程实例:将一张 PNG 的图像隐藏到另外一个 PNG 文件中,不改变原 PNG 图像

此代码的作用是,将一张 PNG 的图像隐藏到另外一个 PNG 文件中,不改变原 PNG 文件的图像的任何地方。

大致原理是,通过 PowerShell 向 PNG 文件指定位置添加任意内容,而不破坏 PNG 文件的图像。将要隐藏的 PNG 文件的内容转换为 Base64 字符串,然后将这个 Base64 字符串隐藏到宿主 PNG 文件的指定位置即可。

隐藏好的 PNG,图像和原来的 PNG 没有任何区别。但用纯文本编辑器强行打开,就能看到后半部分隐藏了另外一张图片的 Base64 内容,这部分 Base64 内容能够还原为另外一张 PNG 图片。此前一些将链接隐藏到一张图片中的“图种”也是类似的原理。

原来是这个 PNG: 要隐藏的 PNG: 隐藏好的 PNG:

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$sourcePngFilePath = "C:\Users\Administrator\Pictures\qqshow.png"   # 宿主PNG文件
$dataFilePath = "C:\Users\Administrator\Pictures\watermark.png" # 要隐写的PNG文件
$outputPngFilePath = "C:\Users\Administrator\Pictures\qqshow1.png" # 输出的PNG文件

# 读取数据文件的内容
$dataContent = [System.IO.File]::ReadAllBytes($dataFilePath)

# 将文件内容转换为 Base64
$base64Content = [Convert]::ToBase64String($dataContent)
$base64Content = "......data:image/png;base64,$base64Content"

# 读取源 PNG 文件的内容
$sourceImageBytes = [System.IO.File]::ReadAllBytes($sourcePngFilePath)

# 打开 PNG 文件并获取文件流
$fileStream = [System.IO.File]::Create($outputPngFilePath)

try {
# 写入源 PNG 文件的字节
$fileStream.Write($sourceImageBytes, 0, $sourceImageBytes.Length)

# 将 Base64 内容转换为字节数组
$base64Bytes = [System.Text.Encoding]::UTF8.GetBytes($base64Content)

# 写入 Base64 字节
$fileStream.Write($base64Bytes, 0, $base64Bytes.Length)
} finally {
# 确保在完成后关闭文件
$fileStream.Close()
}

Write-Host "已成功将 $dataFilePath 的内容以 Base64 形式添加到新的 PNG 文件:$outputPngFilePath。"
Buy me a coffee
No.5972 Alipay

Alipay

推进创文常态化 共建文明襄阳城 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 做文明襄阳人 建文明襄阳城 凝聚文明正能量 筑梦千年古襄阳 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 创建全国文明城市 加快建设汉江流域中心城市 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 讲文明 树新风 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 用微笑融化陌生 用文明美化襄阳 · 🄽🄾5️⃣9️⃣7️⃣2️⃣ · 争当文明使者 播撒文明新风