Страница 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