Как сохранить wxImage в базу данных, используя C++?

У меня есть несколько изображений wxImage, и я хочу сохранить их в BLOB (Binary Large OBject) в базе данных MySQL.

В wxImage и wxBitmap для получения двоичных данных в виде массива unsigned char, чтобы я мог загрузить их в базу данных.

Мой текущий обходной путь — записать изображение во временный файл, а затем загрузить поле BLOB непосредственно из файла.

Есть ли более эффективный способ загрузки и сохранения объекта wxImage в поле MySQL BLOB?

Я использую коннектор MySql C++ 1.05, MS Visual Studio 2008, wxWidgets и C++.


person Thomas Matthews    schedule 30.03.2010    source источник


Ответы (2)


wxWidgets не предоставляет никакого API для данных из wxBitmap (поскольку это зависит от платформы), но wxImage использует четко определенный (и очень простой) формат, к которому вы можете получить доступ, используя его метод GetData(), как упоминалось выше. Просто обратите внимание, что вам может понадобиться использовать GetAlpha(), если ваши изображения имеют альфа-канал.

Однако я бы так не поступил, потому что данные будут огромными, если вы сделаете это так. Хотя сжатие, как тоже предлагалось выше, возможно, зачем делать это вручную, когда wxImage уже поддерживает запись изображения в любом из стандартных форматов изображений. Просто создайте wxMemoryOutputStream и передайте его SaveFile(). Затем просто напрямую обращайтесь к буферу потока, используя GetOutputStreamBuffer()->GetBufferStart() и связанные с ним функции.

person VZ.    schedule 30.03.2010
comment
В прошлый раз, когда я пытался сохранить несжатый файл, мне не удалось создать изображение из данных. Когда я прошел маршрут временного файла, проблем с изображением не было. API говорит не использовать SetData, если вы не знаете, что делаете. - person Thomas Matthews; 31.03.2010
comment
Несмотря на то, что я не советую делать это таким образом, на самом деле нет никаких причин, по которым это не должно работать, поэтому все, что я могу сказать, это то, что где-то в вашем коде должна быть какая-то ошибка. К сожалению, невозможно быть более точным без какой-либо дополнительной информации. - person VZ.; 01.04.2010

Если я что-то не упустил, не могли бы вы использовать WxImage::GetData (http://docs.wxwidgets.org/2.8/wx_wximage.html#wximagegetdata), чтобы получить данные, а затем ::GetHeight и ::GetWidth, чтобы узнать длину данных, на которые указывает указатель? Беззнаковый char *, возвращаемый WxImage::GetData, выглядит так, как будто он должен указывать на данные RGB, из которых состоит изображение.

person Eric Perko    schedule 30.03.2010
comment
Ты прав. Это должно работать. Однако вы можете захотеть сжать данные. - person Nathan Osman; 31.03.2010
comment
В некоторых примерах MySQL BLOB рекомендуется кодировать данные, чтобы они находились в диапазоне печати, чтобы избежать любых опасных двоичных значений. Кроме того, как создать изображение из данных? - person Thomas Matthews; 31.03.2010