Страница 1 из 1

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

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

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

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));

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

Добавлено: 12:58, 28.11.2011
Maxim Mirgorodsky
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;
}

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

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

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

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;
Знатоки делфи помогите, в чём ошибка?

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

Добавлено: 23:42, 07.12.2011
KGB
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, а не длину строки.

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

Добавлено: 00:15, 08.12.2011
Maximus
KGB писал(а):В делфи не проверял sizeof для строки, но есть подозрения, что вернет 4, а не длину строки.
Спасибо большое, действительно возвращает 4, заменил на Length и всё заработало.

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

Добавлено: 19:28, 23.12.2011
ОреЛ
Может кто-то поможет годным примером на С++?

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

Добавлено: 00:39, 29.08.2012
Jenya-Grin
ОреЛ писал(а):Может кто-то поможет годным примером на С++?

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

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% рабочий код отправки изображения.

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

Добавлено: 20:22, 29.08.2012
ОреЛ
Jenya-Grin писал(а): 100% рабочий код отправки изображения.
а если не в C++ Builder?

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

Добавлено: 15:07, 06.02.2013
minlexx
Серверные плагины могут от виртуальных пользователей отправлять изображения в чат?

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

Добавлено: 15:10, 06.02.2013
Jenya-Grin
minlexx писал(а):Серверные плагины могут от виртуальных пользователей отправлять изображения в чат?
Конечно.

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

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

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

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

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

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

Добавлено: 06:39, 07.02.2013
minlexx
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/

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

Добавлено: 22:37, 10.02.2013
Jenya-Grin
songstatus у меня незаработал :(

win 8 x64..

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

Добавлено: 18:26, 08.05.2013
pilotoff
ОреЛ писал(а):
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