Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразовать изображение в PChar 
:(
    Опции темы
ifrost
Дата 30.10.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.8.2009

Репутация: нет
Всего: нет



Добрый день!

Я пользуюсь простенькой классовой обёрткой для SQLite.
Что бы вставить что-либо в blob-поле нужно вызвать:
Код
with SQLiteDatabase do
begin
  CompileSQL('INSERT INTO members(photo) VALUES(?)');
  SetParam(Blob, Size);
  RunSQL;
end


Процедурка SetParam() имеет следующий вид:
Код
procedure SetParam(Blob: PChar; Size: Integer);


Как как мне в параметр Blob передать какую либо картинку?
PM MAIL   Вверх
MetalFan
Дата 30.10.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



если предположить, что PChar - это просто указатель на данные, которые содержат картинку, то можно поступить примерно так:
1. создаешь TMemoryStream
2. сохраняешь в него картинку (TSomeGraphic.SaveToStream), если конечно она умеет сохраняться в поток. или загружаешь ее из файла (TMemoryStream.LoadFromFile).
3. затем отдаешь в SetParam первым параметром TMemoryStream.Memory... а вторым соотв. TMemoryStream.Size
надеюсь понятно объяснил?

Это сообщение отредактировал(а) MetalFan - 30.10.2009, 13:16


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Snowy
Дата 30.10.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



PChar не просто указатель, а строка с нультермитором.
В изображении, как правило, 0 довольно распространёню
Так что мало перегнать в стрим, нужно ещё и кодировать. Например в Base64, как в e-mail
PM MAIL   Вверх
Alexeis
Дата 30.10.2009, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



  Иногда к PChar приводят потому, что с ним разрешена адресная арифметика. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
MetalFan
Дата 30.10.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
ifrost
Дата 2.11.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 6.8.2009

Репутация: нет
Всего: нет



Цитата(MetalFan @ 30.10.2009,  13:16)
если предположить, что PChar - это просто указатель на данные, которые содержат картинку, то можно поступить примерно так:
1. создаешь TMemoryStream
2. сохраняешь в него картинку (TSomeGraphic.SaveToStream), если конечно она умеет сохраняться в поток. или загружаешь ее из файла (TMemoryStream.LoadFromFile).
3. затем отдаешь в SetParam первым параметром TMemoryStream.Memory... а вторым соотв. TMemoryStream.Size
надеюсь понятно объяснил?

Большое спасибо!

У меня соответственно возник {ну чайник я} "обратный" вопрос.
Есть функция
Код
FieldAsBlob(i: Integer): PChar;
 получает данные из поля с индексом i

Как эти полученные данные скопировать в TMemoryStream?
PM MAIL   Вверх
MetalFan
Дата 2.11.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



ну наверняка должна быть еще одна функция, что-то типа FieldSize, или BlobFieldSize...
тогда делается просто:
Код

TMemoryStream.Write( FieldAsBlob(SomeIndex)^, FieldSize(SomeIndex));

ну соотв. создать не забываем стрим.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.