Публикация изображения

Здесь обсуждаются технические аспекты создания дополнений.
Аватара пользователя
Maximus
Сообщения: 497
Зарегистрирован: 18:59, 04.12.2009
Откуда: Воронеж
Контактная информация:

Публикация изображения

Сообщение Maximus » 14:31, 26.11.2011

Может кто-нибудь показать как картинку переконвертировать в текст для отправки? Не нашёл ни одного примера на форуме.

Код: Выделить всё

var
  jpg:TJPEGImage;
  aDataToSend : AnsiString;
begin
  jpg:=TJPEGImage.Create;
  jpg.LoadFromFile('c.jpg'); //файл JPEG
  aDataToSend := fTextToAnsiString('')+  //канал
  fIntegerToAnsiString(0)+  // тип
  AnsiString(jpg); //изображение (как правильно здесь нужно?)
  CommFortProcess(dwPluginID, 51, PAnsiChar(aDataToSend), Length(aDataToSend));

Maxim Mirgorodsky
Администратор
Сообщения: 6731
Зарегистрирован: 09:56, 27.06.2005
Благодарил (а): 1 раз

Re: Публикация изображения

Сообщение Maxim Mirgorodsky » 12:58, 28.11.2011

void __fastcall fJPEGToAnsi(TJPEGImage * jpg, AnsiString *aDest)
{
TMemoryStream * ms1 = new TMemoryStream;
jpg->SaveToStream(ms1);
ms1->Position = 0;

aDest->SetLength(ms1->Size);

memcpy((*aDest).c_str(),ms1->Memory,ms1->Size);
delete ms1;
}

void __fastcall fAnsiToJPEG(AnsiString *aSource,TJPEGImage * jpg)
{
TMemoryStream * ms1 = new TMemoryStream;
ms1->Write((*aSource).c_str(),(*aSource).Length());
ms1->Position = 0;

jpg->LoadFromStream(ms1);

delete ms1;
}

Аватара пользователя
Maximus
Сообщения: 497
Зарегистрирован: 18:59, 04.12.2009
Откуда: Воронеж
Контактная информация:

Re: Публикация изображения

Сообщение Maximus » 18:55, 07.12.2011

На делфи ничего не вышло, чат закрывается при попытке отправить изображение.

Код: Выделить всё

function fJPEGToAnsi(var jpg: TJPEGImage): AnsiString;
var ms1: TMemoryStream;
begin
  ms1:= TMemoryStream.Create;
  jpg.SaveToStream(ms1);
  ms1.Position:= 0;
  SetLength(Result, ms1.Size);
  CopyMemory(@Result[1],ms1.Memory,ms1.Size);
  ms1.Destroy;
end;

Код: Выделить всё

var
  jpg:TJPEGImage;
  aDataToSend, str : AnsiString;
begin
  jpg:=TJPEGImage.Create;
  jpg.LoadFromFile('c.jpg');
  str := fJPEGToAnsi(jpg);
  aDataToSend := fTextToAnsiString('main')+
  fIntegerToAnsiString(1)+
  fIntegerToAnsiString(SizeOf(str))+str;
  CommFortProcess(dwPluginID, 51, PAnsiChar(aDataToSend), Length(aDataToSend));
end;

Знатоки делфи помогите, в чём ошибка?

KGB
Сообщения: 659
Зарегистрирован: 08:54, 13.07.2010
Откуда: Чебоксары, Россия
Контактная информация:

Re: Публикация изображения

Сообщение KGB » 23:42, 07.12.2011

Maximus писал(а):var
jpg:TJPEGImage;
aDataToSend, str : AnsiString;
begin
jpg:=TJPEGImage.Create;
jpg.LoadFromFile('c.jpg');
str := fJPEGToAnsi(jpg);
aDataToSend := fTextToAnsiString('main')+
fIntegerToAnsiString(1)+
fIntegerToAnsiString(SizeOf(str))+str;
CommFortProcess(dwPluginID, 51, PAnsiChar(aDataToSend), Length(aDataToSend));
end;
Знатоки делфи помогите, в чём ошибка?

В делфи не проверял sizeof для строки, но есть подозрения, что вернет 4, а не длину строки.

Аватара пользователя
Maximus
Сообщения: 497
Зарегистрирован: 18:59, 04.12.2009
Откуда: Воронеж
Контактная информация:

Re: Публикация изображения

Сообщение Maximus » 00:15, 08.12.2011

KGB писал(а):В делфи не проверял sizeof для строки, но есть подозрения, что вернет 4, а не длину строки.

Спасибо большое, действительно возвращает 4, заменил на Length и всё заработало.

ОреЛ
Сообщения: 376
Зарегистрирован: 11:18, 11.07.2008
Откуда: Ульяновск
Контактная информация:

Re: Публикация изображения

Сообщение ОреЛ » 19:28, 23.12.2011

Может кто-то поможет годным примером на С++?
Когда пишете программу, всегда думайте о том, что её может затем поддерживать психопат и насильник, который знает где вы живёте.
— Martin Golding

Аватара пользователя
Jenya-Grin
Сообщения: 356
Зарегистрирован: 20:30, 22.09.2011
Откуда: Украина, г.Бердичев

Re: Публикация изображения

Сообщение Jenya-Grin » 00:39, 29.08.2012

ОреЛ писал(а):Может кто-то поможет годным примером на С++?



Код: Выделить всё

AnsiString fJPEGToAnsi(TJPEGImage *jpg)
{
   TMemoryStream * ms1 = new TMemoryStream;
   jpg->SaveToStream(ms1);
   ms1->Position = 0;
   AnsiString *RET;
   RET->SetLength(ms1->Size);
   memcpy((*RET).c_str(),ms1->Memory,ms1->Size);
   delete ms1;
   return *RET;
}



Код: Выделить всё

void PostImg()
{
   TJPEGImage *jpg = new TJPEGImage;
   AnsiString aDataToSend, str;

   jpg->LoadFromFile("C:\\a.jpg");

   str = fJPEGToAnsi(jpg);

   aDataToSend = fTextToAnsiString( uName )+
   fTextToAnsiString( uChan )+
   fIntegerToAnsiString( str.Length() )  +   str;
   (*CommFortProcess)(dwPluginID,1080,aDataToSend.c_str(),aDataToSend.Length());
}


100% рабочий код отправки изображения.

ОреЛ
Сообщения: 376
Зарегистрирован: 11:18, 11.07.2008
Откуда: Ульяновск
Контактная информация:

Re: Публикация изображения

Сообщение ОреЛ » 20:22, 29.08.2012

Jenya-Grin писал(а):100% рабочий код отправки изображения.

а если не в C++ Builder?
Когда пишете программу, всегда думайте о том, что её может затем поддерживать психопат и насильник, который знает где вы живёте.
— Martin Golding

minlexx
Сообщения: 9
Зарегистрирован: 14:35, 29.12.2010

Re: Публикация изображения

Сообщение minlexx » 15:07, 06.02.2013

Серверные плагины могут от виртуальных пользователей отправлять изображения в чат?

Аватара пользователя
Jenya-Grin
Сообщения: 356
Зарегистрирован: 20:30, 22.09.2011
Откуда: Украина, г.Бердичев

Re: Публикация изображения

Сообщение Jenya-Grin » 15:10, 06.02.2013

minlexx писал(а):Серверные плагины могут от виртуальных пользователей отправлять изображения в чат?


Конечно.

minlexx
Сообщения: 9
Зарегистрирован: 14:35, 29.12.2010

Re: Публикация изображения

Сообщение minlexx » 18:14, 06.02.2013

Целый день мучался с отправкой картинок, ошибка оказалась в картинке, хоть это и был JPEG, но похоже сохраненный с опцией jpeg baseline, сервер не понимал картинку; никаких ошибок никуда не появлялось, просто игнорировал. Попробовал другой жипег постить, получилось. Хоть бы в лог или куда сервер писал что-нибудь, а то вообще никаких намеков не давал...

Аватара пользователя
Jenya-Grin
Сообщения: 356
Зарегистрирован: 20:30, 22.09.2011
Откуда: Украина, г.Бердичев

Re: Публикация изображения

Сообщение Jenya-Grin » 21:45, 06.02.2013

minlexx писал(а):Целый день мучался с отправкой картинок, ошибка оказалась в картинке, хоть это и был JPEG, но похоже сохраненный с опцией jpeg baseline, сервер не понимал картинку; никаких ошибок никуда не появлялось, просто игнорировал. Попробовал другой жипег постить, получилось. Хоть бы в лог или куда сервер писал что-нибудь, а то вообще никаких намеков не давал...


А ещё бывает не постит если размер пикселей картинки больше чем разрешено в канале.

На чём пишете?

minlexx
Сообщения: 9
Зарегистрирован: 14:35, 29.12.2010

Re: Публикация изображения

Сообщение minlexx » 06:39, 07.02.2013

Jenya-Grin писал(а):А ещё бывает не постит если размер пикселей картинки больше чем разрешено в канале.

Чтобы такого избежать, постил заведомо маленькую картинку (400х300) размером в 5 кб. В канале размер картинок настроен на "Очень большой"

Jenya-Grin писал(а):На чём пишете?

C++, Mingw32 compiler, IDE Eclipse. Пишу плагин, который с одного небезызвестного развлекательного сайта будет дергать картнки и постить их время от времени в чат. Развлекать ) до кучи там заюзаны либы Curl, zlib, iconv для скачивания по HTTP и конвертации кодировок, FreeImage для работы с картинкой (конвертация в jpeg, изменение размера итп)

P.S. я скорее всего выложу как будет готово, как выкладывал когда-то http://code.google.com/p/commfort-songstatus/

Аватара пользователя
Jenya-Grin
Сообщения: 356
Зарегистрирован: 20:30, 22.09.2011
Откуда: Украина, г.Бердичев

Re: Публикация изображения

Сообщение Jenya-Grin » 22:37, 10.02.2013

songstatus у меня незаработал :(

win 8 x64..

pilotoff
Сообщения: 1
Зарегистрирован: 17:10, 08.05.2013

Re: Публикация изображения

Сообщение pilotoff » 18:26, 08.05.2013

ОреЛ писал(а):
Jenya-Grin писал(а):100% рабочий код отправки изображения.

а если не в C++ Builder?

Код: Выделить всё

FILE *fJPEG = fopen("file.jpg", "rb")
fseek(fJPEG, 0, SEEK_END);
unsigned int size = ftell(fJPEG);
fseek(fJPEG, 0, SEEK_SET);
std::string sJPEG;
sJPEG.resize(size);
fread(&sJPEG[0], BYTE, size, fJPEG);
std::string aDataToSend = fTextToAnsiString( uChannel )+
   fIntegerToAnsiString( 1 )+
   fIntegerToAnsiString( sJPEG.length() )  +   sJPEG;
   (*CommFortProcess)(dwPluginID,51,aDataToSend.c_str(),aDataToSend.Length());

так у меня отрабатывает нормально в MSVS 2010

Ответить