【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
之前我们说过,对于图像处理而言,势必会涉及到文件的读写。但是不同格式文件的读写,这本身又是体力活,而且很多的第三方库已经帮我们实现了,比如opencv。所以,这个时候其实没有必要把精力放在文件的解析上面,然而我们在改进算法、优化性能、软硬件一体开发的同时,肯定也会涉及到文件的读写,所以这个时候建议还是用二进制文件来解决。比如说服务器托管网,输入到arm soc或者是mcu的时候,就会用二进制文件来代替真实的图像文件,处理完了再用python或者类似的工具恢复成bmp、或者jpeg、png图片就可以了。
1、二进制文件的格式
所谓二进制文件,就是说,文件的读取和写入都是采用二进制格式保存的。文件的前面8个字节分别代表高度和宽度。每个数据各有4个字节,且存储的时候是按照大端的方式保存的。在高度和宽度数据之后呢,就是图像数据,数据的数量就是高度乘以宽度的数值。数据中的内容,就是图像数据,一般是单字节,按照从上到下、从左到右依次保存。
#include
#include
#include
#include
#include
#pragma comment(lib, "Ws2_32.lib")
// image header
struct Dimensions
{
uint32_t height;
uint32_t width;
};
2、写入二进制文件
写入二进制文件,一般就是把处理好的图像数据写入到文件当中去。这里面需要注意的地方,就是前面8个字节写入的时候需要进行htonl转换。后面的数据依次写入即可。
// write binary file here
void write_binary_file(const std::string& filename, const Dimensions& dimensions, const std::vector& data)
{
std::ofstream file(filename, std::ios::binary);
if (!file.is_open())
{
std::cerr (&服务器托管网heightBE), sizeof(uint32_t));
file.write(reinterpret_cast(&widthBE), sizeof(uint32_t));
// Write data
file.write(reinterpret_cast(data.data()), data.size());
file.close();
}
3、读取二进制数据
二进制数据的读取,一般也是用于算法处理前的预操作。另外,和写入数据一样,读取数据的时候需要进行字节序的转换,即ntohl。后面的数据依次读取就可以了。
// read binary file here
void read_binary_file(const std::string& filename, Dimensions& dimensions, std::vector& data)
{
std::ifstream file(filename, std::ios::binary);
if (!file.is_open())
{
std::cerr (&heightBE), sizeof(uint32_t));
file.read(reinterpret_cast(&widthBE), sizeof(uint32_t));
dimensions.height = ntohl(heightBE);
dimensions.width = ntohl(widthBE);
// Read data
data.resize(dimensions.height * dimensions.width);
file.read(reinterpret_cast(data.data()), data.size());
file.close();
}
4、代码测试
既然二进制文件写入、二进制文件读取都准备好了,那么下面就可以开始测试了。首先,我们准备高度信息和宽度信息3、4,接下来准备数据,并且将这些数据保存到bin文件当中去。保存完了,回头再用read_binary_file读取出来,如果所有的文件信息都一致,那代表没什么问题,反之就要回头检查一下原因了。当然,这里保存的数据可以是灰度图,还可以是彩色图,这个根据需求灵活进行处理,代码改起来也是很方便的。
// file starts here
int main()
{
// Initialize Winsock
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
std::cerr data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
// Write to binary file
write_binary_file(filename, dimensions, data);
// Read from binary file
Dimensions read_dimensions;
std::vector read_data;
read_binary_file(filename, read_dimensions, read_data);
std::cout (value)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: SwiftUI 动画入门之二:几何特效动画(GeometryEffect)
概览 在上一篇博文 SwiftUI 动画入门之一:路径动画(Path Animations)中,我们讨论了如何打造折线图(LinesGrap)形状上的路径动画。 而在本篇博文中,我们在前篇实现基础之上通服务器托管网过 GeometryEffect 特效为任意路…