【问题标题】:Delphi -- Show images without download [duplicate]Delphi - 无需下载即可显示图像[重复]
【发布时间】:2012-06-19 12:52:36
【问题描述】:

可能重复:
How to get images from URL in Delphi

我使用的是 Delphi 2010,有一些功能我可以下载并以 cximage 或图像对象的形式显示 JPG 或 PNG 图片,但我试图不将图片下载到硬盘驱动器,我想知道是那可能吗?我通过谷歌和stackoverflow搜索但找不到,所有示例都是关于下载文件的。

例如,我在表单中添加了一个 cximage1,并希望显示来自“http://www.someaddress.com/pictures/001.JPG”之类的 url 的图片。

感谢大家的帮助,抱歉英语不好:)

【问题讨论】:

  • 标准“Delphi”(例如 Delphi 2010 或 RAD Developer XE)是一回事 - 它带有一组非常丰富的库和控件。 "cximage" C++ 库有所不同。 DevExpress TcxImage 控件是第三件事。问:你指的是什么?问:你看过文档吗?

标签: delphi image


【解决方案1】:

您可以使用此函数(使用 Delphi 2010 编译和测试)通过 HTTP 下载文件并将其存储在 TBitMap 中。它将读取在 Delphi 的 TGraphic hiearachy 中注册支持的所有文件类型,并自动检测 BMP、GIF、JPG 和 PNG 文件格式:

USES Graphics, IdHTTP, PngImage, jpeg, GIFImg;

FUNCTION DownloadImage(CONST URL : STRING ; ImageType : TGraphicClass = NIL) : TBitMap;
  VAR
    HTTP        : TIdHttp;
    S           : TStream;
    IMG         : TGraphic;
    STR         : AnsiString;

  BEGIN
    HTTP:=TIdHttp.Create(NIL);
    TRY
      S:=TMemoryStream.Create;
      TRY
        HTTP.Get(URL,S);
        IF NOT Assigned(ImageType) THEN BEGIN
          S.Position:=0;
          SetLength(STR,5);
          S.Read(STR[1],LENGTH(STR));
          IF COPY(STR,1,2)='BM' THEN
            ImageType:=TBitMap
          ELSE IF COPY(STR,1,3)='GIF' THEN
            ImageType:=TGIFImage
          ELSE IF COPY(STR,2,3)='PNG' THEN
            ImageType:=TPngImage
          ELSE IF (ORD(STR[1])=$FF) AND (ORD(STR[2])=$D8) THEN
            ImageType:=TJPEGImage
        END;
        IF NOT Assigned(ImageType) THEN RAISE EInvalidImage.Create('Unrecognized file format!');
        IMG:=ImageType.Create;
        TRY
          S.Position:=0;
          IMG.LoadFromStream(S);
          Result:=TBitMap.Create;
          TRY
            Result.Assign(IMG)
          EXCEPT
            Result.Free;
            RAISE
          END
        FINALLY
          IMG.Free
        END
      FINALLY
        S.Free
      END
    FINALLY
      HTTP.Free
    END
  END;

如果您已经知道文件类型,则可以将其指定为 TGifImage、TPngImage、TJPegImage 或 TBitMap 作为第二个参数。如果不是,例程将尝试在这四种类型中自动检测它。如果您使用自定义图形类型,则需要将其指定为第二个参数或更新自动检测逻辑以检测它。

因此,如果您想使用它在 TImage 中显示下载的图像而不将其保存到光盘,您可以这样使用它:

  VAR
    BMP : TBitMap;

  BEGIN
    BMP:=DownloadImage('http://domain.com/image.jpg');
    TRY
      Image1.Picture.Assign(BMP)
    FINALLY
      BMP.Free
    END
  END;

【讨论】:

  • 为什么DownloadImage会返回一个TBitmap?为什么不跳过该步骤并返回 TGraphic IMG。至少对于这个问题,这个转换步骤似乎是不必要的。
  • 感谢您提供的功能,我将尝试并尽快通知您,因此我试图避免将文件保存到光盘,因为大多数测试人员使用 Windows 7 并且不幸的是 UAC 仅限于写入大多数文件夹,这就是为什么我试图从互联网上显示图片而不下载到光盘。我还尝试了 UAC 清单和它为“以管理员身份运行”工作的 res 文件,但不知何故我仍然无法写入程序自己的文件夹。
  • 感谢您的帮助,我尝试了该功能并且效果很好,再次感谢您的帮助。
  • +1 大写字母给代码带来了某种怀旧的涡轮帕斯卡感觉。 :)
  • @Wouter 当然你的意思是 Modula-2 或类似的。 TP 不区分大小写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
相关资源
最近更新 更多