二进制数据图片(bit-data-map): 一种通过图片的形式传递数据信息的方式

本文主要是介绍二进制数据图片(bit-data-map): 一种通过图片的形式传递数据信息的方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二进制数据图片

前言

最近公司那台终端电脑的粘贴功能坏了, 连接远程想从里面拿一个文件出来, 试了好多种方法不顶用, 远程终端开了一堆程序也不能随便重启远程终端, 最终是关了一大堆不必要的应用, 又重启了下rdpclip.exe解决了

Windows服务器远程桌面不能复制粘贴的解决方法

但是解决过程中, 突然想: 复制粘贴不能用, 但是可以正常显示远程的屏幕, 能不能通过截屏就能把文件给搞下来呢?
于是在一波捣鼓之后, 就有了bit-data-map和本文章

名称

bit-data-map, bdmp, 点阵图, 像素点阵图, 文件点阵图, 数据像素点阵图.

关于这种图片的名字, 我其实是想了好久的, 最开始是binary-picture, 之后是pixelPic, 之后考虑这种存储信息类似于点阵, 同时每一个点阵像素代表着一个bit或多个bit的数据, 因此决定使用map作为名称, 于是名称又变成了数据点阵图片binary-pixel-map, 后来名称又变成二进制数据图片binary-data-map, 现在变成了 bit-data-map, 简称bdmp.

简介

简单来说就是通过图片来保存数据的一种方式, 例如将文件中的数据存储到图片中, 同时能够将图片中的数据重新转换为文件.

引入目的

在某种情况下, 通过图片的形式传递数据信息.

简单说一个示例, 例如当你打开远程桌面, 突然发现粘贴板坏了, 此时你需要复制里面的文件到你本地的电脑, 然后就可以将远程桌面的文件转换为图片, 之后通过截屏方式截取屏幕到你的电脑, 之后在你的电脑上重新识别为文件.

二维码是一种通过图片来传递数据信息的方式, 但是二维码传递的信息量太小, 有时我们可能需要通过图片传递大量信息, 例如通过截屏来传递信息.

像素图片引入

一般情况下, 文件以二进制形式保存, 除此之外, 文件还有其它保存方式. 例如将文件转换为Base64编码保存为文本形式, 那么将文件转换为图片点阵方式保存为像素文件也自然是可以的.

点阵系统中, 一个位置, 我们使用白色代表有这个点, 黑色代表没有这个点, 有这个点可以视为1, 没这个点作为0, 那么一个点就可以对应一个bit.

但是我们使用的图片不是黑白图片, 图片颜色多种多样.

假如一个像素有2种颜色, 则一个像素可以代表1个bit
假如一个像素有4种颜色, 则一个像素可以代表2个bit
假如一个像素有16种颜色, 则一个像素可以代表4个bit
假如一个像素有256种颜色, 则一个像素可以代表8个bit

假如一个像素有2^n种颜色, 则一个像素可以代表n个bit

我们使用png图片来表示这个点阵, 一个像素表示点阵中的一个点, 一般来讲一个像素可以使用 256 * 256 * 256种颜色.

假如png图片中, 每个像素有256种颜色, 那么一个像素就可以代表一个字符(8个bit), 假如屏幕分辨率不大, 只有1366 * 768, 那么一张图片便能够存储1366 * 768 = 1,049,088bit数据(差不多是1M数据, 1M数据是1024 * 1024 = 1,048,576bit).

而对于全高清屏(1920*1080)来说, 假如每个像素能够代表1个字节(1Byte), 那么整个屏幕就是(1920*1080=2073600)差不多有2M(1024*1024*2=2097152)数据, 假如每个像素能够代表2个字节(2Byte), 那么一个截屏就能获取将近4M数据, 如果再配合滚动截屏软件, 那么就可以通过屏幕传输更大的数据.

而如果是远程桌面配合本地软件滚动截屏的话, 那么就能够存储更多.

像素图片设计

图片格式

像素图片格式选择png图片格式, 因为.png是不会失真, 而 .jpg 图片格式会失真.

像素内容设计

将一个文件转换为像素图片后, 还能够再从像素图片转换为文件, 那么至少需要将文件的文件名等文件信息存入像素图片中.

图片中的像素颜色在截屏时可能会出现失真, 例如像素的颜色在经过截屏之后变成了宁外一种颜色(具体会不会, 我没有具体研究过, 只不过我这么认为而已), 因此在像素图片头部将代表颜色的像素依次写入图片可以有效地防止图片的颜色改变

假如点阵有4种颜色, 白, 黑, 黄, 绿, 分别代表0, 1, 2, 3. 那么就在头部将这4中颜色写入图片, 读取图片的时候, 先读取这写颜色, 之后所有的像素都按照这几种颜色进行解析成二进制.

像素图片有效区域

一个像素图片可以通过矩形截屏, 截屏之后的图片也能够转换为文件, 那么如何确定像素图片的有效内容呢?

类似于二维码有黑白黑的正方形定位区, 可以用来定位和识别二维码, 但是像素图片不需要那么复杂, 有效内容外包裹一圈黑白相间的点阵即可.

像素图片生成流程

  1. 首先读取要制作为像素图片的文件, 根据文件的名称, 大小, 以及传入的参数计算并确定出像素图片大小, 像素图片的颜色类型, 每个点的宽度, 图片内容边缘宽度, 定位区等信息.
  2. 根据上一步计算的信息生成.png图片, 添加背景色为灰色, 之后在内容定位区外边缘绘制出一圈黑白相间的点(左上角的点为黑色起始点, 之后向下, 向右两个不同的方向扩展到右下角).
  3. 写入像素图片标记, 像素颜色数量, 像素颜色, 一行像素数量, 像素图片头长度.
  4. 将文件名称, 文件日期, 文件MD5码等信息封装后写入像素头.
  5. 写入像素内容.
  6. 生成像素图片.

像素图片解析流程

  1. 读取图片
  2. 找到像素信息有效位置
  3. 获取像素信息数据
  4. 解析像素信息数据
  5. 将Md5值和解析后的像素信息数据做对比
  6. 转储为文件.

demo 示例

例如 二进制数据图片 这几个文字的表达方式.

  1. 二进制数据图片

    每个像素代表1个bit数据.
    使用黑色和白色做边框, 使用红色和蓝色作为二进制的 0, 1, 生成的图片

  2. 四进制数据图片

    每个像素代表2个bit数据.
    灰色, 红色, 绿色, 蓝色 分别代表 四进制的 0, 1, 2, 3.
    四进制数据图片

  3. 16进制数据图片

    每个点代表4bit数据.
    16进制数据图片

  4. 256进制数据图片

    每个点代表8bit数据(1个字节).
    256进制数据图片

  5. 一个84Kb的bit数据图片, 以及他的二进制像素图片,

    每个点代表8bit数据
    bdmp-core.zip 文件大小84.1KB, 其生成的bit-data-map图片大小为100kb.
    在这里插入图片描述
    在这里插入图片描述

git

相关源码我已放到了github和gitee上管理, 上面有最新的代码, 以及一些开发中的功能, 欢迎大家下载查看

github: https://github.com/cosycode/bit-data-map
gitee: https://gitee.com/cosycode/bit-data-map`

同时我也将代码打包成jar, 发布到 maven 仓库, 欢迎大家使用

repo

  1. Apache Maven

    <dependency>
    <groupId>com.github.cosycode</groupId>
    <artifactId>bit-data-map</artifactId>
    <version>1.0</version>
    </dependency>
    
  2. gradle

    implementation 'com.github.cosycode:bit-data-map:1.0'
    

使用方式

  1. 在项目中导入jar

  2. 将文件转换为图片示例

    /*** 生成二级制数据像素图片方式0** @throws IOException 读取文件异常*/@Testpublic void geneBdmp0() throws IOException {// 待转换的文件final String SOURCE_PATH = "D:\\Users\\CPF\\Desktop\\轻音乐-兰花草.mp3";// 转换后的文件存放位置final String bdmpFilePath = SOURCE_PATH + ".png";BdmpHandle.convertFileToBdmp(SOURCE_PATH, bdmpFilePath, 800, 2, 20, (byte) 8);}/*** 生成二级制数据像素图片方式1** @throws IOException 读取文件异常*/@Testpublic void geneBdmp1() throws IOException {// 待转换的文件final String SOURCE_PATH = "D:\\Users\\CPF\\Desktop\\轻音乐-兰花草.mp3";// 转换后的文件存放位置final String bdmpFilePath = SOURCE_PATH + ".png";// 数据源final BdmpSource bdmpSource = BdmpSource.geneByFile(new File(SOURCE_PATH));// 二进制数据图片配置BdmpGeneConfig config = new BdmpGeneConfig();// 设置图片边缘为 20pxconfig.setMargin(20);// 设置图片一行点阵数量为 800 个config.setRowPixelCnt(800);// 设置每个点阵宽度为1像素config.setPixelSideWidth(1);// 设置每个点阵高度为1像素config.setPixelSideHeight(1);// 设置 每个点阵表示 8 bit, 每个点阵有 2^8 = 256种颜色config.setMappingColor(BdmpUtils.getPxType(8));// 生成的bit-data-map的生成信息类final BdmpGeneInfo bdmpGeneInfo = new BdmpGeneInfo(config, bdmpSource);// 生成图片final BufferedImage image = PixelPngDrawer.geneRatePixelPng(bdmpGeneInfo);// 保存图片 png表示保存格式ImageIO.write(image, "png", new FileOutputStream(bdmpFilePath));}
  3. 将图片转换回文件示例

     @Testpublic void recBdmp() throws IOException {// 待转换的图片文件final String SOURCE_PATH = "D:\\Users\\CPF\\Desktop\\轻音乐-兰花草.mp3.png";// 转换后的文件存放文件夹final String recDirPath = "D:\\Users\\CPF\\Desktop\\";BdmpHandle.convertBdmpToFile(SOURCE_PATH, recDirPath);}
    
  4. 转换的文件信息以及转换后的图片信息
    在这里插入图片描述
    在这里插入图片描述

有了这个,以后从远程终端取文件就不需要直接传输文件了

这篇关于二进制数据图片(bit-data-map): 一种通过图片的形式传递数据信息的方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1048102

相关文章

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Linux挂载linux/Windows共享目录实现方式

《Linux挂载linux/Windows共享目录实现方式》:本文主要介绍Linux挂载linux/Windows共享目录实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录文件共享协议linux环境作为服务端(NFS)在服务器端安装 NFS创建要共享的目录修改 NFS 配

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别