使用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的话,有时候你运行程序就会出现如下提示

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值