使用C++写一个自己定义的图像格式,写入磁盘

news2024/11/18 0:21:35

看到OpenCV的Image类实例一副图像,觉得挺好玩,因此想自己定义一个自己的图像类,让后完成写盘,并且读取出来。没有办法,再利用一下OpenCV的imshow显示一下,看看和自己的预期是否一样。

首先要先定义一个图像类,就叫Image吧!

class Image{
public:
    // 构造函数,使用行和列来构造(16位图)
    Image(unsigned short row,unsigned short col):rows(row),cols(col){
        ID=1001;
        pixel=new unsigned short[rows*cols];

    }
    // 设置图像的像素
    void setPixel(unsigned short* data){
        for(int i=0;i<rows*cols;++i){
            pixel[i]=data[i];
        }

    }
    // 获取图像的像素,返回的是数组指针
    unsigned short *getPixel()const {
        return pixel;
    }
    // 析构函数
    ~Image(){
        delete[] pixel;
    }
    // 序列化,进行存盘和读取操作
    void serialize(fstream &fs,bool bWrite);

private:
    // 私有成员,都是16位数据
    unsigned short ID;
    unsigned short rows;
    unsigned short cols;
    unsigned short *pixel;
};
// 序列化的具体实现
void Image::serialize(fstream &fs, bool bWrite){
    int pixelLength=rows*cols;
    if(bWrite){
        fs.write((char*)&ID,sizeof(ID));
        fs.write((char*)&rows,sizeof(rows));
        fs.write((char*)&cols,sizeof(cols));
        fs.write((char*)*&pixel,sizeof(unsigned short)*pixelLength);
    }
    else{
        fs.read((char*)&ID,sizeof(ID));
        fs.read((char*)&rows,sizeof(rows));
        fs.read((char*)&cols,sizeof(cols));
        fs.read((char*)&pixel[0],sizeof(unsigned short)*pixelLength);
    }
}

然后我们就在主函数中进行操作吧!

int main()
{
    // 首先,定义一个文件流
    fstream file;
    /*
    // Prepare the pixel data and write it to a binary file on disk.
    int r=1024;
    int c=1024;
    unsigned short data[r*c];   //data[][200]
    // 给像素赋值
    for(int i=0;i<r;i++){
        for(int j=0;j<c;++j){
            data[c*i+j]=j%c;
        }
    }

    // 实例化一个image
    Image image(r,c);
    // 设置像素值
    image.setPixel(data);
    // 打开文件,状态输出,二进制格式
    file.open("../data/image.bin",ios::out|ios::binary);
    image.serialize(file,true);  //写文件
    file.close(); //关闭
    */


    // Read and display the image
    file.open("../data/image.bin",ios::in|ios::binary);
    file.seekg(0,ios::end);
    cout<<"File size is: "<<file.tellg()<<endl;
    file.seekg(0,ios::beg);
    int row=1024;
    int col=1024;
    Image img(row,col);
    img.serialize(file,false);

    //cout<<sizeof(img.pixel)/sizeof(img.pixel[0])<<endl;
    //cout<<img.ID<<endl;
    //cout<<img.rows<<endl;
    //cout<<img.cols<<endl;
    file.close();



    // 借用OpenCV进行显示
    cv::Mat im=cv::Mat(row,col,CV_16UC1,img.getPixel());
    cv::normalize(im,im,0,255,cv::NORM_MINMAX,CV_8UC1);
    cv::imshow("",im);
    cv::waitKey();

    return 0;
}

输出结果:File size is: 2097158

这里我们的像素是1024X1024 16位,因此,它的大小为2097152,然后在Image中的ID,rows和cols都是16位,所以共占用6个字节,因此,整个文件就是2097158个字节。

输出的图像在下面

最后,如果你使用的是Mac Sonama 14.1系统的话,使用QtCreateor的IDE的话,有时候你运行程序就会出现如下提示

 不要慌张,把你的输入法切换到英文就行了,再次运行就没有这个抱怨了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

养猫家庭有什么宠物空气净化器推荐吗?哪款吸毛效果最好?

不知道你们家的猫最近有没有大量掉毛&#xff1f;还是今早穿短袖感觉到有点冷&#xff0c;我才意识到秋天到了&#xff0c;新一轮的换毛季又来了。不仅和猫咪玩耍的时候可以“采摘”不少毛毛&#xff0c;而且家里的衣服上、地板上也被毛发入侵&#xff0c;感觉用不了多久&#…

Python基础之List列表用法

1、创建列表 names ["张三","李四","王五","Mary"] 2、列表分片 names[1]&#xff1a;获取数组的第2个元素。 names[1:3]&#xff1a;获取数组的第2、第3个元素。包含左侧&#xff0c;不包含右侧。 names[:3]等同于names[0:3]&…

DAY3 JAVA基本语法

了解注释 注释是写在程序中对代码进行解释说明的文字,方便自己和其他人查看,以便理解程序的。 注释不影响程序的运行,编译后的class文件夹没有内容 字面量 在Java中,字面量(literal)是用来表示源代码中常量值的符号。 这些字面量可以直接出现在Java源代码中,并且它们代…

搜狗翻译体验,2024四大翻译工具解析!

为了满足广大用户的需求&#xff0c;市面上涌现出了众多优秀的翻译工具&#xff0c;福昕在线翻译、福昕翻译客户端、海鲸AI翻译、搜狗翻译等。今天&#xff0c;我们就来对比一下这些翻译工具&#xff0c;看看它们各自的特点和优势。 福昕在线翻译&#xff1a;专业精准&#xf…

前端初识之一

网页 什么是网页 网站是指在因特网上根据一定的规则&#xff0c;使用 HTML等制作的用于展示特定内容相关的网页集合。 网页是网站中的一“页”&#xff0c;通常是HTML格式的文件&#xff0c;它要通过浏览器来阅读&#xff0c; 网页是构成网站的基本元素&#xff0c;它通常由…

【通过WSL2安装Ubuntu24.04系统及图形化界面】

WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个为Windows用户设计的兼容层&#xff0c;它允许用户在Windows10和Windows11操作系统上直接运行GNU/Linux环境。WSL提供了一个微软开发的Linux兼容内核接口&#xff0c;使得用户可以在不启动虚拟机或使用双重启动设…

PostgreSQL的学习心得和知识总结(一百五十三)|[performance]将 OR 子句转换为 ANY 表达式

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

安装Unity3D并配置VisualStudio

安装Unity3D并配置VisualStudio 由于近期课程要求&#xff0c;需要在电脑上安装Unity3D并配置VisualStudio&#xff0c;所以顺便写了本篇博文 1.下载Unity Hub 首先我们找到Unity中文官网&#xff0c;下载Unity Hub&#xff0c;它可以帮助我们管理我们的Unity项目和版本&#…

vue3.x系列之封装响应式的hooks技巧

v3.x封装一个接口请求的hooks的&#xff0c;都应该很熟练了&#xff0c;那么要实现一个响应式的hooks该怎么做&#xff1f; 实现效果 代码实现 <template><div v-if"error">Oops! Error encountered: {{ error.message }}</div><div v-else-i…

【第2章 开始学习C++】C++语句

文章目录 导语声明语句和变量赋值语句cout的新花样使用cin类简介 导语 C 程序是一组函数&#xff0c; 而每个函数又是一组语句。 C 有好几种语句&#xff0c;例如&#xff1a;声明语句创建变量&#xff0c; 赋值语句给该变量提供一个值。 声明语句和变量 计算机是一种精确的…

selenium-Alert类用于操作提示框/确认弹框(4)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.alert()可以返回Alert对象&#xff0c;而Alert对象主要用于网页中弹出的提示框/确认框/文本输入框的确认或者取消等动作。 Alert介绍 当在页面定位到提示框/确认框/文本录入…

集成学习和随机森林

集成学习 生活中的集成学习&#xff1a; 买东西找别推荐 import numpy as np import matplotlib.pyplot as pltfrom sklearn import datasetsX, y datasets.make_moons(n_samples500, noise0.3, random_state42)plt.scatter(X[y0,0], X[y0,1]) plt.scatter(X[y1,0], X[y1,1]…

OpenSource - License 开源项目 TrueLicense

文章目录 官网集成Demo 官网 https://truelicense.namespace.global/ https://github.com/christian-schlichtherle/truelicense 集成Demo https://github.com/christian-schlichtherle/truelicense-maven-archetype https://github.com/zifangsky/LicenseDemo https://git…

工厂车间|基于springBoot的工厂车间系统设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完…

《Java基础》常用类

综述 深入理解包装类 和 String类 一、包装类 针对八种基本数据类型都有一个引用类型的包装类&#xff0c;这个类可以自动包装和解包 基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdoubleDouble 这几个类的继承关系&…

零工市场转型数字化的挑战和机遇

我们的生活因为科技而变的更加方便、便利&#xff0c;例如手机支付、网上购物&#xff0c;那么就目前的就业市场来说&#xff0c;零工市场也面临着数字化转型的挑战和机遇。 零工市场数字化的机遇&#xff1a; 1.通过大数据的计算&#xff0c;极大的提高了零工市场中的匹配效率…

跨平台应用程序本地化过程的特点

跨平台应用程序本地化不仅仅是将单词从一种语言翻译成另一种语言。这是关于调整应用程序&#xff0c;使其无缝融入全球用户的不同文化和语言环境&#xff0c;无论他们使用的是哪种设备或平台。这个过程对于跨平台应用程序来说尤其复杂&#xff0c;它们需要在多个操作系统和设备…

汽车车轮平衡块行业前景:预计2030年全球市场规模将达到10亿美元

汽车车轮平衡块&#xff0c;也称为轮胎平衡块&#xff0c;是一种安装在车轮上的配重部件。它的主要作用是帮助车轮在高速旋转状态下保持动平衡。当车轮高速旋转时&#xff0c;由于车轮的动态不平衡状态&#xff0c;会导致车辆在行驶中出现车轮抖动和方向盘震动的现象。汽车车轮…

[Python] 文件操作详解

文章目录 文件是什么&#xff1f;常用的文件操作函数1. 打开文件2. 关闭文件3. 读取文件(1) read() 方法(2) readline() 方法(3) readlines() 方法 4. 写入文件(1) write() 方法(2) 追加写入 5. 文件读写模式总结 中文文件的处理指定文件编码 上下文管理器示例&#xff1a;使用…

posix接口与system V接口及其异同

POSIX接口和System V接口是用于多线程和进程间通信的两种主要编程接口。它们各自有不同的特点、功能和适用场景。以下是对这两种接口的详细介绍及其异同点。 POSIX接口 特点 标准化: POSIX&#xff08;可移植操作系统接口&#xff09;是由IEEE制定的标准&#xff0c;旨在提供统…