Я пытаюсь сохранить изображение (.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];
}