我正在尝试将图像(.png
)存储到sqlite3
数据库中。一个简单的灰度图像将由opencv
创建,并将通过使用cv::imencode(cv::Mat img, params)
命令(功能的输出为std::vector<uchar>
)存储到缓冲区中。
接下来,我想将其推送到数据库中。因此,我正在准备一个sqlite3
表,语句等……这很好。
要添加blob
内容,我需要执行以下步骤(最小示例):
bool MyClass::bindTableContent(int index, std::vector<uchar> data){
char * blob_imdecode = reinterpret_cast<char*>(data.data());
this->rc = sqlite3_bind_blob(this->statement, index, blob_imdecode, sizeof(blob_imdecode[0]) * data.size(), SQLITE_STATIC);
if (this->rc != SQLITE_OK) {
return false;
}
if(sqlite3_step(this->statement) == SQLITE_DONE){
return true;
}
else{
return false;
}
}
完成此操作后,blob
数据即存储在数据库中,但是数据类型错误(我猜是出问题了,长度可能是错误的,...)。
如果我对此向量进行imdecode
并使用imwrite
保存,则图像将正确保存。
尽管如此,如果我用fstream
读取图像并执行与上述相同的操作,则数据将正确存储(作为.png
)到数据库中(最小示例):
bool MyClass::bindTableContent(int index, std::string image_path){
char * blob;
std::ifstream::pos_type size;
std::ifstream file(image_path, std::ios::in | std::ios::binary | std::ios::ate);
if (file.is_open()) {
size = file.tellg();
blob = new char[size];
file.seekg(0, std::ios::beg);
file.read(blob, size);
file.close();
}
else{
blob = NULL;
}
this->rc = sqlite3_bind_blob(this->statement, index, blob, size, SQLITE_STATIC);
delete [] blob;
if (this->rc != SQLITE_OK) {
return false;
}
if(sqlite3_step(this->statement) == SQLITE_DONE){
return true;
}
else{
return false;
}
}
有人有什么想法吗?
我将非常感谢您的帮助:)
*解决方案* 如果有人遇到相同的问题,请使用以下解决方案:
制作输入矢量数据的硬拷贝/替换:
char * blob_imdecode = reinterpret_cast<char*>(data.data());
到
char * blob;
blob = new char[data.size()];
for(int i = 0; i < data.size(); i++){
blob[i] = data[i];
}