Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Загрузка и отображение изображений из интернета для начинающих программистов на основе опыта работы с CPC464

Delphi , Интернет и Сети , Интернет

 

Введение

В этой статье мы рассмотрим практический пример создания приложения на Lazarus (Free Pascal), которое загружает и отображает изображения из интернета. В качестве примера возьмем проект энтузиаста Gigatron, который создал программу для просмотра изображений игр с компьютера Amstrad CPC 464.

Подготовка проекта

Для работы с HTTPS-запросами нам понадобится SSL-библиотека. Скачайте архив по ссылке: https://wiki.overbyte.eu/arch/openssl-1.1.1w-win64.zip и распакуйте файлы в папку с проектом.

Основной функционал

Создадим форму с элементами управления для загрузки изображений:

unit Unit1;
{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,
  Spin, BGRAVirtualScreen, BGRABitmap, BGRABitmapTypes, OpenSSLSockets,
  fphttpclient;

type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Panel1: TPanel;
    SpinEdit1: TSpinEdit;
    SpinEdit2: TSpinEdit;
    VirtualScreen: TBGRAVirtualScreen;
    procedure BGRAVirtualScreenRedraw(Sender: TObject; Bitmap: TBGRABitmap);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    FBitmap: TBGRABitmap;
  public
  end;

var
  Form1: TForm1;
  img_num, img_slot, mono: integer;
  HttpClient: TFPHTTPClient;
  MemStream: TMemoryStream;
  ImageURL, ImageWWW: string;

implementation
{$R *.lfm}

Загрузка изображения

Основная логика загрузки изображения реализована в обработчике нажатия кнопки:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Assigned(FBitmap) then
  begin
    FBitmap.Free;
    FBitmap := nil;
  end;

  Imagewww := 'https://www.cpc-power.com/extra_lire_fichier.php?extra=cpcold&fiche=';
  ImageURL := Imagewww+inttostr(img_num)+'&slot='+inttostr(img_slot)+'&part=A&type=.png&green='+inttoStr(mono)+'';
  img_num  := SpinEdit1.value;
  img_slot := SpinEdit2.value;

  HttpClient := TFPHTTPClient.Create(nil);
  MemStream := TMemoryStream.Create;

  try
    try
      HttpClient.Get(ImageURL, MemStream);
      MemStream.Position := 0;
      FBitmap := TBGRABitmap.Create(MemStream);
      VirtualScreen.DiscardBitmap;
      VirtualScreen.RedrawBitmap;
    except
      on E: Exception do
        ShowMessage('Ошибка загрузки: ' + E.Message);
    end;
  finally
    HttpClient.Free;
    MemStream.Free;
  end;

  Label1.Caption:= 'Номер изображения: '+ IntToStr(img_num);
  Label2.Caption:= 'Слот изображения: '+ IntToStr(img_slot);
end;

Отображение изображения

Для отображения изображения используем компонент TBGRAVirtualScreen:

procedure TForm1.BGRAVirtualScreenRedraw(Sender: TObject; Bitmap: TBGRABitmap);
begin
  Bitmap.Fill(BGRAWhite);
  if Assigned(FBitmap) then
  begin
    bitmap.StretchPutImage(rect(0,0,320*2,256*2), Fbitmap, dmSet);
  end;
end;

Улучшенная версия с дополнительными функциями

В улучшенной версии добавлены: - Переключение между цветным и монохромным режимом - Список избранного - Автоматическое извлечение названия игры из HTML

function GetGameTitle(const URL: string): string;
var
  HttpClient: TFPHTTPClient;
  PageSource: TStringList;
  Regex: TRegExpr;
  RawTitle: string;
begin
  Result := 'Название не найдено';
  HttpClient := TFPHTTPClient.Create(nil);
  PageSource := TStringList.Create;
  Regex := TRegExpr.Create;

  try
    try
      PageSource.Text := HttpClient.Get(URL);

      Regex.Expression := '<title>(.*?)</title>';
      if Regex.Exec(PageSource.Text) then
      begin
        RawTitle := Regex.Match[1];
        RawTitle := StringReplace(RawTitle, '&copy', ' :', [rfReplaceAll]);
        RawTitle := Trim(RawTitle);

        while Pos('  ', RawTitle) > 0 do
          RawTitle := StringReplace(RawTitle, '  ', ' ', [rfReplaceAll]);

        Result := UpperCase(RawTitle);
      end;
    except
      on E: Exception do
        Result := 'Ошибка: ' + E.Message;
    end;
  finally
    HttpClient.Free;
    PageSource.Free;
    Regex.Free;
  end;
end;

Добавление в избранное

procedure TForm1.Button2Click(Sender: TObject);
var
  game_name: String;
  idx: Integer;
begin
  idx := Pos(' : ', GameTitle);
  if idx > 0 then
    game_name := Copy(GameTitle, 1, idx - 1)
  else
    game_name := GameTitle;

  ListBox1.Items.Add(IntToStr(img_num) + ' : ' + game_name);
end;

Альтернативное решение с использованием Indy

Хотя в данном проекте используется TFPHTTPClient, можно реализовать аналогичный функционал с помощью компонентов Indy:

uses
  IdHTTP, IdSSLOpenSSL;

procedure TForm1.Button1Click(Sender: TObject);
var
  IdHTTP: TIdHTTP;
  SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  IdHTTP := TIdHTTP.Create(nil);
  SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    IdHTTP.IOHandler := SSLIOHandler;
    MemStream.Clear;
    IdHTTP.Get(ImageURL, MemStream);
    MemStream.Position := 0;

    if Assigned(FBitmap) then
      FreeAndNil(FBitmap);

    FBitmap := TBGRABitmap.Create(MemStream);
    VirtualScreen.RedrawBitmap;
  except
    on E: Exception do
      ShowMessage('Ошибка: ' + E.Message);
  end;
  IdHTTP.Free;
  SSLIOHandler.Free;
end;

Заключение

В этой статье мы рассмотрели практический пример создания приложения для загрузки и отображения изображений из интернета с использованием Lazarus (Free Pascal). Проект демонстрирует: 1. Работу с HTTP-запросами 2. Обработку изображений 3. Парсинг HTML-контента 4. Создание пользовательского интерфейса

Этот код может служить основой для более сложных проектов, таких как каталогизаторы изображений, просмотрщики галерей или специализированные клиенты для конкретных веб-ресурсов.

Для дальнейшего развития проекта можно добавить: - Кэширование загруженных изображений - Поддержку прокси-серверов - Расширенный поиск по каталогу игр - Экспорт изображений в различные форматы

Исходный код проекта можно адаптировать для работы с другими веб-ресурсами, изменив URL-шаблоны и параметры запросов.

Создано по материалам из источника по ссылке.

Контекст описывает создание приложения на Lazarus для загрузки и отображения изображений из интернета с примерами кода и возможными улучшениями.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Интернет ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 10:30:40/0.0038111209869385/0