当前位置: 首页 > article >正文

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

看到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.kler.cn/a/349440.html

相关文章:

  • unity学习-灯光类型
  • 高可用之限流 08-leaky bucket漏桶算法
  • leetcode解题思路分析(一百六十一)1394 - 1400 题
  • ros service不走是为什么
  • STM32的独立看门狗定时器(IWDG)技术介绍
  • spring面试之2024
  • 【量化交易】聚宽安装
  • Linux虚拟化技术嬗变综述
  • MeterSphere接口自动化平台调试
  • 使用 Spring 框架构建 MVC 应用程序:初学者教程
  • 【三】【算法】P1007 独木桥,P1012 [NOIP1998 提高组] 拼数,P1019 [NOIP2000 提高组] 单词接龙
  • 元学习案例(学习如何学习)
  • vue3中如何给响应式对象
  • 微分几何-曲线论(向量函数)
  • 2024年【汽车驾驶员(技师)】考试题库及汽车驾驶员(技师)试题及解析
  • 集合框架05:List接口使用、List实现类、ArrayList使用
  • ListView的Items绑定和comboBox和CheckBox组合使用实现复选框的功能
  • C/C++语言基础--C++异常看这一篇就够了
  • 实景三维赋能自然资源精细化管理创新
  • 【翻译】自定义 Qt Designer 窗体