通过高性能的二维矩阵编码,将数据有效载荷嵌入到普通图像或视频中。
BitGlitter的Python项目详细描述
基本知识
单击此处查看真实流的演示视频。
Bitglitter是一个易于使用的库,允许您将数据嵌入到普通图片或视频中。存储和宿主 可承载图像或视频的文件。
从物理条码到数字数据传输
无论是商店里的条形码还是你可以用手机扫描的二维码——它们都是按照相同的原理工作的。数据 被编码成黑白。你可以把每种颜色看作是二进制值的抽象,所以当 这些颜色是按顺序读取的,您可以从图像中提取有意义的数据。我想知道这个概念怎么可能 改进后,我想要一个很酷的第一个项目作为编程入门。Bitglitter诞生了。
传统的条码在数据密度方面的应用受到了严重的限制。当你最大化
为数字数字传输提供了概念和配置,获得了很多性能。
Bitglitter在很多方面都属于自己的一个类:
- 多个调色板:通过取消仅使用黑白的限制,您可以
在一个给定的"块"(每一个方块)上保持在飞弹的框架上。常规的双色设置为每个块保留一位。
四色包含两位(2x),六十四色包含六位(6x),无损~16.7M调色板包含24位 (比黑白提高24倍)。您可以根据应用程序选择要使用的调色板。
较小的数据集对压缩和损坏有很大的抵抗力,而较大的数据集具有更高的数据密度。你可以 创建您自己的自定义调色板以及您想使用的任何颜色。下面详细介绍。 - 多帧视频:Bitglitter自动将较大的文件分成多个帧,并带有多个标题
内置于其中。其中包括防止损坏的几层保护,以及关于框架的元数据
以及流本身,以便读者能够智能地决定如何处理它。通过缝合这些框架
您可以将任意大小的文件和文件夹一起嵌入视频和图像中,并将它们转换为视频。
您只受硬盘驱动器的限制。 - 可变块大小:帧中的每个块都可以设置为任何大小,包括一个像素。大块 在有损耗的环境中,大小为流提供保护,而较小的块允许更大的密度。
目前,BitGlitter配置为在计算机上传输文件和文件夹。但只要稍加修改 使用视频或图像作为几乎任何类型二进制数据的载体。
这在实际中意味着什么
以下是一些真实的数据,可以让您了解此操作的可能性:
<表><广告>简单地说,你现在可以制作视频,其中可以保存大量的数据。可能有一些漂亮的 有趣的应用程序,可以从中获得。
功能
数据
- 支持大小高达~1eb或~4.3b帧的流:换句话说,对 流的大小。
- 已添加压缩:这是自动完成的,因此在 发送。
- 添加了加密:可选的AES-256加密以保护您的文件。密码用
scrypt
散列, 参数可根据您的需要定制。 - 文件屏蔽:屏蔽流中包含哪些文件的可选功能。只有那些成功抓住 流(并在适用时解密)将知道其内容。
输出的文件
您可以选择将所有帧输出为一系列图像(.png)或单个.mp4。
- 可定制分辨率:您可以完全控制输出帧的大小,无论它们是480p还是 8K,
- 可自定义帧速率:当前支持每秒30帧和60帧,自定义值即将推出。
- 自定义调色板:包含的默认调色板只是一个起点。做任何你喜欢的调色板 想与它的使用美学相匹配。任何阅读流的人都将自动保存调色板 他们的机器,所以他们也可以使用它!功能包括输出一个文本文件,概述所有 您可以使用的调色板,包括默认调色板和自定义调色板。
读数
针对压缩或损坏的错误更正:Bitglit保护您的文件不受损坏和瑕疵的影响 在图像或视频上。加载正确的调色板后,只要检测到不正确的颜色,它就会"捕捉"到 调色板中最近的颜色。这使您的文件抵抗格式更改、编解码器或文件大小 减少。这使得Bitglitter流仍然可以在环境中读取,否则将呈现所有现有的 无法读取隐写术方法。
完整的文件完整性:创建流时,对整个流进行哈希(sha-256),如下所示 以及每一帧。数据必须与预期接受的匹配ed.损坏或损坏的文件不会盲目 传给你。
流线型帧绕过:如果无法或不需要读取帧(即,重复的已读),则 读卡器根据初始帧头确定此值
设计
文件中没有保存元数据:压缩流、更改格式、将其上载到某个位置。所有数据都在 块,所以您不必(太)担心流的不可读性。
易懂:无论您是在学习python并想了解它是如何工作的,还是正在寻找 贡献、文档字符串和注释遍布整个库。
内置防伪功能:截至目前,Bitglitter只有一个协议(协议1),它是 有关如何处理数据、帧的组件及其布局的过程。每个协议都有 拥有唯一的身份证。此ID在写入过程中添加到头中,并在
read()
。随着新协议的创建,没有包含这些协议的旧版本Bitglitter将通知用户 更新他们的版本以便阅读。所有旧的协议版本都保存在未来的库中 迭代,因此无论协议版本在流中使用的时间有多长,它始终能够被读取。全模块化设计:您有专门的用例吗?使这个库适应你自己的需要是很容易的。 我已经建立了Bitglitter易于修改和扩展。与其担心低级功能, 使用我创建的模块化组件实现您的目标。
应用程序
待定。这将随着时间的推移而更新!
如何使用
下面将解释运行此库的所有函数。我还在维基百科的几个页面上解释 Bitglitter的细节(如何工作等)包括一些插图。这些还没有完成, 但是如果您想查看项目的wiki,这里是它的链接!
安装
除了从github下载代码外,您还可以直接从pypi获取它:
PIP安装Bitglit
重要提示:您需要手动获取的唯一部分是ffmpeg.exe的副本。把它放在同一个文件夹里 代码将运行,您将被设置。这将在不久的将来自动完成。把包裹拿过来 屏幕左侧:
https://ffmpeg.org/download.html
只需要ffmpeg.exe即可。
所需的第三方库
位字符串
-位操作。加密
-加密功能。ffmpeg python
-视频渲染和输出。opencv python
-视频加载和帧操作。枕头
-帧创建和输出,以及加载图像和读取像素值。
感谢Tanmay Mishra为我提供了他即将发布的库的预发布版本filepackager
。已经很严重了
为适应这个图书馆而修改和精简。代码包含在Bitglitter中;无需下载。
60秒后闪烁
尽管它附带了很多功能,但您所需要使用的只是write()
(创建流)和
read()
(读取并提取其中编码的数据)。两者唯一需要的参数是
希望以字符串格式输入。
write(),将文件转换为BitglittER流
我们现在将更深入一点。
write()
是一个函数,它输入文件并将其转换为Bitglit流。有不少争论
自定义流,但只有一个必需参数。其他的都有默认值。
毫不奇怪,这个必需的参数定义了您希望在流中嵌入的文件或文件夹。如果且仅当
您发送的是单个文件或文件夹路径,参数filelist
接受路径字符串。Bitglitter还支持
同时发送多个文件和文件夹,其中没有限制!这需要使用元组或列表项
用文件或文件夹路径的字符串填充。将自动忽略不存在的文件或文件夹路径。
streamname=''
是您可以选择的标题流,它将打印在任何人的屏幕上
读取文件以及其他流数据。
stream description=''
用作文本字段,可以选择放置流的描述。
outputpath=false
是您可以选择定义所创建媒体的输出路径的地方。通过
默认情况下,媒体保存在运行python文件的位置。如果使用,文件夹路径必须已存在。
outputmode='video'
是定义流输出方式的地方,无论是作为.mp4视频还是一系列
.png图像。只有两个有效参数是'image'
和'video'
compressionenabled=true
在渲染到帧之前启用或禁用数据压缩。这是启用的
默认情况下。
filemaskenabled=false
是可以从流头中省略文件/文件夹列表的位置。这是有效的
隐藏流的内容,除非流已完全读取。默认情况下,这是禁用的。这意味着什么时候
有人读取您的流,在前几帧中它将自动显示流的内容(文件
以及它们的尺寸)在屏幕上。
encryptionkey=''
可以选择使用AES-256加密数据。默认情况下,这是禁用的。这条河不会
除非读卡器成功输入,否则可以读取。
参数scryptn=14
,scryptr=8
和scryptp=1
允许您自定义键派生的参数
功能。如果你是一个临时用户,你将永远不需要触摸这些(也不应该)。仅在以下情况下更改这些设置
你对密码学很在行,你知道自己在做什么!值得注意的是,scryptn使用它的参数
2^n.最后,如果要更改这些数字,则必须在read()
期间手动输入,否则将解密
会失败!出于安全原因,故意不在流中传输自定义值。您的最终用户
流必须知道这些自定义参数。
headerPaletteID='6'
设置开始时"设置"帧中使用的调色板。强烈建议您使用
如果您不知道自己在做什么,这里是一个默认调色板,因为这是关于
流是被读取的,通过使用自定义调色板,任何人都不可能读到还没有"学会"的流
调色板。
streampaletteid=6'
设置用于有效负载的调色板。默认情况下,使用4位默认颜色集。我将
解释下面所有关于调色板的内容。
pixelwidth=24
设置渲染时每个块的像素宽度。默认为20像素。这是一个非常
关于可读性的重要价值。把它们放得太大会使阅读更容易,但会导致
高效的帧和需要更长的流。使它们变小会大大增加它们
效率,但同时如果文件是缩小或其他
扭曲。
blockheight=45
设置框架的高度,默认设置为45(与
blockwidth
,创建一个完美的1080p大小的帧。
blockwidth=80
设置帧的宽度。默认设置为96。
frames per second=30
设置视频每秒播放的帧数,假设参数为outputmode="video"
。
目前,支持每秒30帧和60帧。
最后,我们有几个参数来控制日志记录。
logging level="info"
确定输出的日志消息级别。它接受三个参数-info
是
默认值,仅在read()
和write()
期间显示核心状态数据。'debug'
同时显示信息级消息
来自不同进程的低级消息。布尔型false
完全禁用日志记录。
loggingScreenOutput=true
设置是否在屏幕上显示日志消息。只接受类型bool
。
默认启用。
LoggingSaveOutput=false
确定日志消息是否保存为文本文件。只接受类型bool
。
默认情况下禁用。如果设置为true
,将创建一个日志文件夹,文本文件将自动保存在其中。
这些默认值的传输速率为81kb/s。这只是一个起点,应该很难 腐败。
read(),将流转换回数据
read()
是用于输入Bitglit流(无论是图像还是视频)并输出文件的项。
与write()
一样,所需的唯一参数是bitgrilt编码的文件,无论它是图像还是视频。
filetoinput
是唯一必需的参数。我们再看其他的。
outputpath=none
是您可以设置在成功加载所有帧后保存此流的位置。
它是'set and forget',所以如果您加载图像,此参数只需使用一次,文件夹路径将
坚持住那条小溪。此参数需要一个已存在的强文件夹路径。
badFrameStrikes=10
这设置读取器在退出视频之前要检测多少损坏的帧。这个
允许您在视频严重损坏时相对快速地脱离流,而无需
在每个帧上迭代。如果设置为0,它将完全禁用打击,并尝试读取每个帧
无论腐败程度如何。
blockheightoverride=false
和blockwidthoverride=false
允许您手动输入流的块高度和
块宽度。通常您不需要使用这个,因为这些值是在帧被锁定时自动获得的
上。但对于严重损坏或压缩的帧,情况可能并非如此。通过使用覆盖,读取器将
在给定这些参数的情况下,尝试锁定屏幕。必须同时填写这两项才能使覆盖生效。
encryption key=none
是添加加密密钥以解密流的位置。像参数outputpath一样,只有
需要此参数一次,它将绑定到该保存。
参数scryptn=14
,scryptr=8
和scryptp=1
loggingLevel='信息'
,loggingScreenOutput=true
,loggingSaveOutput=false
-请参见
write()。
调色板
如果您想制作自己的自定义调色板,Bitglitter可以让您使用这些功能来完成此操作。
addcustompalette(palettename,palettedescription,colorset,optional昵称=)
此函数添加自定义调色板
使用.<>
参数palette name
接受一个字符串,是显示和传输的调色板的名称。
参数paletteddescription
也接受一个字符串,如果要添加,它是调色板的描述。
参数colorset
接受rgb元组的元组,这些元组将是bitgrilt流中使用的实际颜色。这里是
使用两种颜色的简单示例:colorset=((0,255,0),(0,0,255))
。有几个
对这些元组的要求:
- 不能添加两个相同的值。例如,具有相同rgb值的黑色两次。使用的每种颜色 必须是独一无二的!"不同"的颜色越多越好。
- 您必须至少有两种颜色。
- 必须使用2^n种颜色,因此2、4、8、16等。
argumentoptional昵称="
允许您为自定义调色板使用易于输入的昵称。这个绰号是
如何选择此调色板以在流上特别运行。在内部,自定义调色板具有64个字符的ID
您可以使用的代码(更多信息见下文)。这允许你给它一个字符串来指定它为
好。此字段是可选的。如果您决定使用它,内部ID和昵称都将起作用。
编辑昵称到自定义调色板(idornick,newname)
此函数允许您编辑自定义调色板的昵称
去别的地方。两个参数都需要字符串。您可以使用您分配给它的昵称,也可以使用它的内部ID。
printfullplettelist(path)
此函数将文本文件输出到文件夹路径,列出可用的选项板
默认选项板和自定义。它显示诸如他们的名字,描述,创建日期,颜色集,昵称,
还有更多。必需的参数是文件夹路径的字符串,该字符串必须已存在。下面是一个如何
格式化:c:\用户\标记\桌面
clearAllCustomPalettes()
这将从配置中删除所有自定义调色板。请注意,默认选项板
不会被删除。
removeCustomPalette(idornick)
此函数从配置中删除自定义调色板。它接受一个字符串参数
它要么是内部ID,要么是您以前给它的昵称。
removeCustomPaletteNickname(idornick)
此函数将删除与自定义调色板关联的任何昵称。它需要一个
内部id或以前昵称的字符串参数。
clearCustomPaletteNickes()
这将从所有自定义调色板中删除所有昵称。
部分保存控制
一旦读取流的第一帧,就创建partialSave对象。这就是管理二进制文件的本质 字符串,并保存有关其状态的各种信息。这些功能有助于更好地与它们进行交互。
updatePartialSave(streamsha,reattempassembly=true,passwordupdate=none,scryptn=none,scryptr=none,scryptp=none,changeOutputPath=none)
此函数允许您更新保存的各种参数。要求
streamsha
的字符串输入,它是字符串的ID号。
参数reattempassembly
使汇编程序
尝试重新组合帧,并输出嵌入的文件和文件夹。这将用于
密码或scrypt参数不正确,您想再试一次。
argumentpasswordupdate
接受一个字符串参数,并将添加(或替换)绑定到此流的加密密钥。
argumentsscryptn、scryptr和scryptp
更改用于派生用于解密的密钥的scrypt参数。如果
scrypt参数在流的write()
期间保留为默认值,这些参数可以保持原样。否则,
无论是在这里还是在eread()
的可选参数
beginAssembly(streamsha)
此函数用于在以后启动包的程序集,而不是这样做
无论出于何种原因,请立即执行。
printfullsavelist(path,debugdata=false)
此函数将文本文件输出到文件夹路径,列出所有(如果有的话)
系统上的部分保存。您可以检查它们的状态,以及partialsave对象的状态
本身。默认情况下,argumentdebugdata
是false
,但使其能够true
输出各种调试信息
也用于修饰或说明这个对象,对于像普通的最终用户这样的人来说,这个对象不太实用。
removepartialsave(stream sha)
使用流id的字符串参数(或通常使用的流sha),这将
从配置中删除该对象,并删除与其相关的所有临时数据。
removeAllPartialSaves()
所有保存都将从配置对象中删除,并清除所有临时数据。
一般配置
outputStats(path)
此函数为您提供了Bitglitter使用的简洁鸟瞰图。在所有read()和
write()
周期,传输的数据总量,以及传输的总帧和单个块
已扫描的添加到正在运行的总数中。参数path
需要已存在的文件夹路径的字符串参数。
一个小文本文件将被写入此位置。
clearStats()
所有统计信息都将重置为零。
clearsession()
此操作清除所有输入的数据。自定义颜色、统计信息和部分保存对象都将被删除,
以及部分读取流的任何临时数据。这实际上是一次硬复位。
贡献
无论你是一个经验丰富的程序员还是一个全新的程序员,你都可以做很多事情来帮助这个项目成功。 加入我们的Discord服务器,查看我在"信息"类别中发布的所有信息。谢谢你 你的兴趣!
不和谐链接
另外,一定要查看 贡献母版页。里面有很多 信息的。
实际限值
值得一提的是,你在使用它时可能会面临的限制。而图像和视频Bitglit的输出是 无损(没有压缩应用),互联网上的"真实世界"大不相同。例如,多媒体 上传到流行的社交媒体网站是定期压缩的,以节省空间(并最终减少 费用)。你在一定程度上受到比特闪光的保护。写参数是完全可定制的 主要是因为这个原因。
虽然可以使用更大的颜色集、更小的块和更快的帧速率获得更大的吞吐量,但是 它是否工作的实际限制取决于其压缩降低质量的程度。以牺牲 吞吐量、较大的块、较慢的帧速率和使用的颜色较少将使流远小于em>对 可能的腐败。接近这些参数的极限(很小的块大小,非常快的帧速率,非常 在读取并将其转换回数据方面,需要非常精确地测量 位置和颜色值;编解码器的目的是模糊那些精确的值以降低其比特率,然后 文件大小。当Bitglitter检测到损坏并执行"紧急停止"时,我知道你不想处理 这一点,你与之分享的人也不例外。
最后,了解视频使用的环境,以确保阅读成功。
麻省理工学院许可证
2019年——马克·米肯
兹免费向任何获得本软件及相关软件副本的人授予许可 文档文件("软件"),无限制地处理软件,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或销售软件副本的权利,以及 在满足以下条件的情况下,向其提供软件的人员:
上述版权通知和本许可通知应包含在 软件。
软件按"原样"提供,无任何明示或暗示的保证,包括但不限于 适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或 无论是在合同诉讼、侵权诉讼或 否则,由本软件或本软件的使用或其他交易产生、产生或与之相关。