通过高性能的二维矩阵编码,将数据有效载荷嵌入到普通图像或视频中。

BitGlitter的Python项目详细描述


downloads

不协调服务器

Bitglitter logo

基本知识

Bitglitter示例gif

单击此处查看真实流的演示视频。

Bitglitter是一个易于使用的库,允许您将数据嵌入到普通图片或视频中。存储和宿主 可承载图像或视频的文件。

从物理条码到数字数据传输

无论是商店里的条形码还是你可以用手机扫描的二维码——它们都是按照相同的原理工作的。数据 被编码成黑白。你可以把每种颜色看作是二进制值的抽象,所以当 这些颜色是按顺序读取的,您可以从图像中提取有意义的数据。我想知道这个概念怎么可能 改进后,我想要一个很酷的第一个项目作为编程入门。Bitglitter诞生了。

传统的条码在数据密度方面的应用受到了严重的限制。当你最大化 为数字数字传输提供了概念和配置,获得了很多性能。
Bitglitter在很多方面都属于自己的一个类:

Bitglitter默认调色板

  • 多个调色板:通过取消仅使用黑白的限制,您可以 在一个给定的"块"(每一个方块)上保持在飞弹的框架上。常规的双色设置为每个块保留一位。
    四色包含两位(2x),六十四色包含六位(6x),无损~16.7M调色板包含24位 (比黑白提高24倍)。您可以根据应用程序选择要使用的调色板。
    较小的数据集对压缩和损坏有很大的抵抗力,而较大的数据集具有更高的数据密度。你可以 创建您自己的自定义调色板以及您想使用的任何颜色。下面详细介绍。
  • 多帧视频:Bitglitter自动将较大的文件分成多个帧,并带有多个标题 内置于其中。其中包括防止损坏的几层保护,以及关于框架的元数据 以及流本身,以便读者能够智能地决定如何处理它。通过缝合这些框架 您可以将任意大小的文件和文件夹一起嵌入视频和图像中,并将它们转换为视频。
    您只受硬盘驱动器的限制。
  • 可变块大小:帧中的每个块都可以设置为任何大小,包括一个像素。大块 在有损耗的环境中,大小为流提供保护,而较小的块允许更大的密度。

目前,BitGlitter配置为在计算机上传输文件和文件夹。但只要稍加修改 使用视频或图像作为几乎任何类型二进制数据的载体。

这在实际中意味着什么

以下是一些真实的数据,可以让您了解此操作的可能性:

<表><广告>颜色数 每个块的位数屏幕RE解决方案块大小(像素) 块尺寸 帧速率吞吐量无损应用程序 < /广告><正文>640 x 480(480p)32 x 242.88千字节/秒<不< < > >1280_-720(720p)64 x 3617.28千字节/秒<不< < > >1280_-720(720p)64 x 3625.92千字节/秒<不< < > >1920 x 1080(1080p)96 x 5477.76千字节/秒<不< < > >1920 x 1080(1080p)96 x 54116.64千字节/秒<不< < > >1920 x 1080(1080p)96 x 54233.28千字节/秒<不< < > >167772161920 x 1080(1080p)384 x 2167.47 MB/秒 >是167772163840 x 2160(4K)768 x 43259.7兆字节/秒 >是

简单地说,你现在可以制作视频,其中可以保存大量的数据。可能有一些漂亮的 有趣的应用程序,可以从中获得。

功能

数据

  • 支持大小高达~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=14scryptr=8scryptp=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=falseblockwidthoverride=false允许您手动输入流的块高度和 块宽度。通常您不需要使用这个,因为这些值是在帧被锁定时自动获得的 上。但对于严重损坏或压缩的帧,情况可能并非如此。通过使用覆盖,读取器将 在给定这些参数的情况下,尝试锁定屏幕。必须同时填写这两项才能使覆盖生效。

encryption key=none是添加加密密钥以解密流的位置。像参数outputpath一样,只有 需要此参数一次,它将绑定到该保存。

参数scryptn=14scryptr=8scryptp=1

loggingLevel='信息'loggingScreenOutput=trueloggingSaveOutput=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对象的状态 本身。默认情况下,argumentdebugdatafalse,但使其能够true输出各种调试信息 也用于修饰或说明这个对象,对于像普通的最终用户这样的人来说,这个对象不太实用。

removepartialsave(stream sha)使用流id的字符串参数(或通常使用的流sha),这将 从配置中删除该对象,并删除与其相关的所有临时数据。

removeAllPartialSaves()所有保存都将从配置对象中删除,并清除所有临时数据。

一般配置

outputStats(path)此函数为您提供了Bitglitter使用的简洁鸟瞰图。在所有read()和 write()周期,传输的数据总量,以及传输的总帧和单个块 已扫描的添加到正在运行的总数中。参数path需要已存在的文件夹路径的字符串参数。 一个小文本文件将被写入此位置。

clearStats()所有统计信息都将重置为零。

clearsession()此操作清除所有输入的数据。自定义颜色、统计信息和部分保存对象都将被删除, 以及部分读取流的任何临时数据。这实际上是一次硬复位。

贡献

无论你是一个经验丰富的程序员还是一个全新的程序员,你都可以做很多事情来帮助这个项目成功。 加入我们的Discord服务器,查看我在"信息"类别中发布的所有信息。谢谢你 你的兴趣!

不和谐链接

https://discord.gg/t9uv2pz

另外,一定要查看 贡献母版页。里面有很多 信息的。

splitter

实际限值

值得一提的是,你在使用它时可能会面临的限制。而图像和视频Bitglit的输出是 无损(没有压缩应用),互联网上的"真实世界"大不相同。例如,多媒体 上传到流行的社交媒体网站是定期压缩的,以节省空间(并最终减少 费用)。你在一定程度上受到比特闪光的保护。写参数是完全可定制的 主要是因为这个原因。

虽然可以使用更大的颜色集、更小的块和更快的帧速率获得更大的吞吐量,但是 它是否工作的实际限制取决于其压缩降低质量的程度。以牺牲 吞吐量、较大的块、较慢的帧速率和使用的颜色较少将使流远小于em>对 可能的腐败。接近这些参数的极限(很小的块大小,非常快的帧速率,非常 在读取并将其转换回数据方面,需要非常精确地测量 位置和颜色值;编解码器的目的是模糊那些精确的值以降低其比特率,然后 文件大小。当Bitglitter检测到损坏并执行"紧急停止"时,我知道你不想处理 这一点,你与之分享的人也不例外。

最后,了解视频使用的环境,以确保阅读成功。

麻省理工学院许可证

2019年——马克·米肯

兹免费向任何获得本软件及相关软件副本的人授予许可 文档文件("软件"),无限制地处理软件,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或销售软件副本的权利,以及 在满足以下条件的情况下,向其提供软件的人员:

上述版权通知和本许可通知应包含在 软件。

软件按"原样"提供,无任何明示或暗示的保证,包括但不限于 适销性、特定用途适用性和非侵权性的保证。在任何情况下,作者或 无论是在合同诉讼、侵权诉讼或 否则,由本软件或本软件的使用或其他交易产生、产生或与之相关。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
使用多个参数的枚举   从Oracle到Redis的java复制表   java如何保护tomcat服务器中的db用户名和密码。xml   java如何使用注册密钥保护移动应用程序?   java在什么情况下超类不应该是抽象的?   java Backspace键在macOS上的Scala REPL中不起作用   arduino Java+Uno+RFID:调用方法读取Java中的RFID   带有where语句中集合的java JPA查询   java如何向基于Tyrus注释的客户端添加请求头   java对我的二进制搜索算法的反馈   java重新访问数据库时文件的内容不正确   用户在字符串中输入值后退出While循环(Java)   java如何在Maven中的多个项目之间共享项目依赖关系?   java Close从未在数据库上被明确调用   在java中从文件读入布尔矩阵   Java:如何使用父节点将XML流拆分为小型XML文档。VTDXML