Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.04.2012, 00:11   #1
einstein22
 
Аватар для einstein22
 
Регистрация: 24.04.2012
Сообщений: 8
По умолчанию Занесение картинки в переменную

Здравствуйте. Вот у меня есть скрипт, делающий скриншоты
Код:
procedure ScreenShot(PathToSave: string);
begin
  with TBitmap.Create do
  begin
    Width := Screen.Width;
    Height := Screen.Height;

    BitBlt(Canvas.Handle, 0, 0, Width, Height,
        GetDC(GetDesktopWindow), 0, 0, SRCCOPY);

    SaveToFile(PathToSave);
    Free;
  end;
end;
а потом просто вызываю эту функцию

Код:
ScreenShot('C:\Screen.bmp');
Но есть проблема. Надоело отправлять эти скриншоты с директории через filezilla на сайт , поэтому надо автоматизировать передачу.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
 PostData:TStringList;
begin
PostData:= TStringList.Create;
    PostData.Add('to=1');
    IdHTTP1.Post('http://mysite.com/tester.php',PostData);
end;
Как мне сделать так, чтобы скриншот не сохранялся на диск, а каким то образом заносился в буфер и прикручивался к переменной (если такое возможно), а код, который отправляет сейчас переменную to со значением 1 отправлял этот скрин?? Помогите пожалуйста.

P.S. в delphi новичек, поэтому прошу писать подробно, если будет решение моей проблемы.
Заранее спасибо!
einstein22 вне форума Ответить с цитированием
Старый 24.04.2012, 00:17   #2
Delphi_ProGer
Форумчанин
 
Регистрация: 30.10.2010
Сообщений: 524
По умолчанию

ИМХО, нужно копать в сторону Multipart form-data.
Delphi_ProGer вне форума Ответить с цитированием
Старый 24.04.2012, 01:14   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Delphi_ProGer прав. Похожий вопрос обсуждался здесь:
http://programmersforum.ru/showthread.php?t=42803
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 24.04.2012, 14:43   #4
einstein22
 
Аватар для einstein22
 
Регистрация: 24.04.2012
Сообщений: 8
По умолчанию

Покопал немного и нашел примитивное решение второй проблемы. У меня получилось все до дикости просто:
Код:
procedure TForm1.btn2Click(Sender: TObject);
var
  multi: TIdMultiPartFormDataStream;
begin
  multi:= TIdMultiPartFormDataStream.Create;
  multi.AddFormField('submit','ok');
  multi.AddFile('img','C:\img.jpg','application/octet-stream');
  IdHTTP1.Post('http://сайт.com.ua/tester.php',multi);

  ShowMessage('ok');

end;
Но стоит учесть, что тут я передаю картинку с жесткого диска. А можно ли сделать так, чтобы первая часть скрипта не сохраняла файл на диск, а вторая не доставала его опять оттуда? То есть каким то образом передавать картинку напрямую для передачи на сайт без лишних действий?
einstein22 вне форума Ответить с цитированием
Старый 24.04.2012, 18:23   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Код:
procedure ScreenShot(var PathToSave: tmemorystream);
begin
  with TBitmap.Create do
  begin
    Width := Screen.Width;
    Height := Screen.Height;

    BitBlt(Canvas.Handle, 0, 0, Width, Height,
        GetDC(GetDesktopWindow), 0, 0, SRCCOPY);

    savetostream(PathToSave);
    Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);

var
  multi: TIdMultiPartFormDataStream;
  list:tstringlist;
  ts:tmemorystream;
begin
  ts:=tmemorystream.Create;
  list:=tstringlist.Create;
  ScreenShot(ts);

  multi:= TIdMultiPartFormDataStream.Create;
  multi.AddFormField('upload','yes');
  ts.Position:=0;
  multi.AddObject('F', 'image/bmp',ts,'123.bmp');
  list.Text:=IdHTTP1.Post('http://www.radikal.ru/action.aspx',multi);

  list.SaveToFile('1.html');
  ts.SaveToFile('1.bmp');
  multi.free;
  list.free;
  ts.Free;
end;
Проверил - отправляет картинку на Радикал.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 24.04.2012 в 18:29.
BDA на форуме Ответить с цитированием
Старый 24.04.2012, 20:22   #6
einstein22
 
Аватар для einstein22
 
Регистрация: 24.04.2012
Сообщений: 8
По умолчанию

Правда у меня не получилось, но все равно спасибо! И не получилось, скорее всего, из-за php файла. Ведь раньше у меня стояла multi.AddFile и в php скрипте получателя $_FILES[]. А теперь AddObject. Как тогда мне быть?
И еще, в delphi я полный новичек, поэтому хотелось бы уточнить некоторые детали: для чего было создавать переменную ts, да еще типа ts:tmemorystream и эта строка
ts.Position:=0;
??
einstein22 вне форума Ответить с цитированием
Старый 24.04.2012, 20:31   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Вы сами хотели не создавать файлов на жестком диске
TMemoryStream - поток данных, хранящийся в оперативной памяти.
ts.position=0, возможно, не нужно делать. Я не смогу объяснить, этот момент. Если, например, мы пишем в поток, то позиция смещается. Чтобы прочитать из потока, мы должны указать позицию перед данными, которые хотим считать. Я добивался того, чтобы отправляемый пакет как можно больше совпадал с тем, который отправляется через браузер.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 24.04.2012, 20:52   #8
einstein22
 
Аватар для einstein22
 
Регистрация: 24.04.2012
Сообщений: 8
По умолчанию

Понятно Но надо как то выйти из положения же. Если радикал принимает файли, значит мне надо просто изменить скрипт php. Я немного поискал, но не смог найти ничего нормального. Вы не знаете какой массив принимает данные?
Или может быть надо место
multi.AddObject('F', 'image/bmp',ts,'123.bmp'); писать multi.AddFile(..) , но ts перевести в строку, чтобы не было ошибок?
Но если это все будет слишком сложно или вовсе не возможно, то тогда ничего не поделаешь Придется сохранять - отправлять - удалять
einstein22 вне форума Ответить с цитированием
Старый 25.04.2012, 01:47   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Вариант с переводом в строку вряд ли пройдет.
А вы изменили поля отправки?
Код:
multi.AddFormField('submit','ok');
multi.AddObject('img', 'application/octet-stream',ts,'123.bmp');
Неплохо было бы перехватывать Charles`ом запросы и смотреть отличия работающего и неработающего вариантов.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 25.04.2012, 09:52   #10
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Есть же буфер для картинок... можно попробовать сразу туда кидать скриншот. Можно еще попробовать stream воспользоваться.
SovereignSun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать .bat: поиск данных в выводе команды и занесение в переменную Vilgelm Операционные системы общие вопросы 8 14.08.2011 16:46
Занесение данных в БД a_n_n_a Общие вопросы Delphi 11 07.07.2011 14:10
Отображение картинки на кнопке WPF. Загрузка картинки из ресурсов. Проблема с Uri. Casper-SC Общие вопросы .NET 0 27.06.2010 23:11
занесение данных в таблицу ASAN Microsoft Office Excel 7 02.06.2008 23:50
Занесение данных в переменную jora-objora Помощь студентам 2 05.01.2008 20:12