Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.02.2019, 19:30
crazyman crazyman вне форума
Новичок
 
Регистрация: 22.04.2012
Сообщения: 76
Репутация: 10
По умолчанию Загрузка картинок из интернета

Скачиваю 97 картинок с сайта (имена картинок 1,2,3 и т.д. .jpg).Подскажите пожалуйста что не так! скачиваются 97 одинаковых картинок!
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdHttp, jpeg, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  http: TIdHttp;
  potok:   TMemoryStream;
  jpeg: TJpegImage;
  i:integer;
begin
  http := TIdHTTP.Create(nil);
  ms := TMemoryStream.Create;
  jpeg := TJpegImage.Create;
   for i:= 1 to 97 do
   begin
     try

       http.Get('//тут источник картинок'+inttostr(i)+'.jpg', potok);
       potok.Position := 0;
       jpeg.LoadFromStream(ms);
      
        jpeg.SaveToFile('c:/jpgimage/'+inttostr(i)+'.jpg');



    finally
    jpeg.Free; ms.Free; http.Free;
    end;
   end;
end;


end.
Ответить с цитированием
  #2  
Старый 09.02.2019, 19:59
crazyman crazyman вне форума
Новичок
 
Регистрация: 22.04.2012
Сообщения: 76
Репутация: 10
По умолчанию

Цитата:
Сообщение от crazyman
Скачиваю 97 картинок с сайта (имена картинок 1,2,3 и т.д. .jpg).Подскажите пожалуйста что не так! скачиваются 97 одинаковых картинок!
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdHttp, jpeg, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  http: TIdHttp;
  potok:   TMemoryStream;
  jpeg: TJpegImage;
  i:integer;
begin
  http := TIdHTTP.Create(nil);
  ms := TMemoryStream.Create;
  jpeg := TJpegImage.Create;
   for i:= 1 to 97 do
   begin
     try

       http.Get('//тут источник картинок'+inttostr(i)+'.jpg', potok);
       potok.Position := 0;
       jpeg.LoadFromStream(ms);
      
        jpeg.SaveToFile('c:/jpgimage/'+inttostr(i)+'.jpg');



    finally
    jpeg.Free; ms.Free; http.Free;
    end;
   end;
end;


end.
нашел решение potok.clear
Ответить с цитированием
  #3  
Старый 10.02.2019, 01:10
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,309
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

Кхм... ну у тебя вообще предствлвенный код не код, а багодром.
И это не смотря на то, что имена переменных для потоков попутаны (ну тут подозреваю последствия вырезания кода для поста).
А по сути:
1. Не надо повторно использовать объекты. Создавай новые, это не так дорого стоить на современных системах.
2. Try..Finally у тебя является частью цикла, так лучше не делать.
3. Непонятен смысл испльзования промежуточного jpeg, а что, сразу в TFileStream религия не позволяет сохранять?
4. И вообще, такие вещи лучше переписать на многопоточность, не на модемах давно уже сидим, можно качать потоков так в 10, будет качаться раза в 3 быстрее, чем в один поток (да, кода будет чуть поболее, зато быстрее будет).
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
crazyman (10.02.2019)
  #4  
Старый 10.02.2019, 10:38
crazyman crazyman вне форума
Новичок
 
Регистрация: 22.04.2012
Сообщения: 76
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Кхм... ну у тебя вообще предствлвенный код не код, а багодром.
И это не смотря на то, что имена переменных для потоков попутаны (ну тут подозреваю последствия вырезания кода для поста).
А по сути:
1. Не надо повторно использовать объекты. Создавай новые, это не так дорого стоить на современных системах.
2. Try..Finally у тебя является частью цикла, так лучше не делать.
3. Непонятен смысл испльзования промежуточного jpeg, а что, сразу в TFileStream религия не позволяет сохранять?
4. И вообще, такие вещи лучше переписать на многопоточность, не на модемах давно уже сидим, можно качать потоков так в 10, будет качаться раза в 3 быстрее, чем в один поток (да, кода будет чуть поболее, зато быстрее будет).
ну да, очень не аккуратный код.
это была в общем-то разовая акция, нужно было скачать книжку, которая
была картинками представлена, качальщиком сайтов оч. долго, поэтому решил накидать код.
Ответить с цитированием
  #5  
Старый 10.02.2019, 20:26
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,309
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

А-а-а... я в подобном случае просто сгенерил html и загрузил его через браузер. Потом просто сохраняешь страничку и забираешь картинки из соотв. папки.
Ответить с цитированием
  #6  
Старый 11.02.2019, 21:26
crazyman crazyman вне форума
Новичок
 
Регистрация: 22.04.2012
Сообщения: 76
Репутация: 10
Радость

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdHttp, jpeg, Vcl.StdCtrls, Vcl.ExtCtrls,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    //Image1: TImage;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  http: TIdHttp;
  potok:   TMemoryStream;
  jpeg: TJpegImage;
  i:integer;
begin
  http := TIdHTTP.Create(nil);
  potok := TMemoryStream.Create;
  jpeg := TJpegImage.Create;
     try
      for i:= 1 to 97 do
      begin
       http.Get('http://img.gdz-online.ws/29032018fdfsrt13/'+inttostr(i)+'.jpg', potok);
       potok.Position := 0;
       jpeg.LoadFromStream(potok);
       jpeg.SaveToFile('c:/'+inttostr(i)+'.jpg');
       potok.Clear;
      end;
    finally
    jpeg.Free; potok.Free; http.Free;
    end;
end;
end.
Вот поправил код, теперь красивее

Последний раз редактировалось crazyman, 11.02.2019 в 21:28.
Ответить с цитированием
  #7  
Старый 12.02.2019, 02:04
Аватар для lmikle
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,309
Версия Delphi: 7, XE3, 10.2
Репутация: 49087
По умолчанию

Ну тогда уж так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  http: TIdHttp;
  potok:   TFileStream;
  i:integer;
begin
  http := TIdHTTP.Create(nil);
  try
    for i:= 1 to 97 do
    try
      potok := TFileStream.Create('c:/'+inttostr(i)+'.jpg',fmCreate);
      http.Get('http://img.gdz-online.ws/29032018fdfsrt13/'+inttostr(i)+'.jpg', potok);
    finally
      potok.free;	
    end;
  finally
    http.Free;
  end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
crazyman (13.02.2019)
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter