Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi--显示图像而不下载_Delphi_Image - Fatal编程技术网

Delphi--显示图像而不下载

Delphi--显示图像而不下载,delphi,image,Delphi,Image,可能重复: 我使用的是Delphi2010,有一些功能我可以下载并以cximage或image对象的形式显示JPG或PNG图片,但我尝试不将图片下载到硬盘,我想知道这可能吗?我通过google&stackoverflow搜索,但找不到,所有样本都是关于下载文件的 例如,我在表单中添加了一个cximage1,并希望显示来自类似“”的url的图片 感谢所有帮助,并为糟糕的英语感到抱歉:)您可以使用此函数(使用Delphi 2010编译和测试)通过HTTP下载文件并将其存储在TBitMap中。它将读

可能重复:

我使用的是Delphi2010,有一些功能我可以下载并以cximage或image对象的形式显示JPG或PNG图片,但我尝试不将图片下载到硬盘,我想知道这可能吗?我通过google&stackoverflow搜索,但找不到,所有样本都是关于下载文件的

例如,我在表单中添加了一个cximage1,并希望显示来自类似“”的url的图片

感谢所有帮助,并为糟糕的英语感到抱歉:)

您可以使用此函数(使用Delphi 2010编译和测试)通过HTTP下载文件并将其存储在TBitMap中。它将读取在Delphi的TGraphic Hierarchy中注册支持的所有文件类型,并自动检测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。如果没有,例程将尝试在这四种类型中自动检测它。如果使用自定义图形类型,则需要将其指定为第2个参数,或更新自动检测逻辑以检测它

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

  VAR
    BMP : TBitMap;

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

标准的“Delphi”(例如Delphi2010或RAD Developer XE)是一回事——它附带了一组非常丰富的库和控件。C++库是不同的。DevExpress TcxImage控件还是第三件事。问:你指的是什么?问:你看过文档了吗?为什么DownloadImage会返回TBitmap?为什么不跳过该步骤并返回TGraphic IMG呢。至少在这个问题上,转换步骤似乎是不必要的。感谢您提供的功能,我将尝试并尽快让您知道,因此我试图避免将文件保存到光盘,因为大多数使用windows 7和不幸的UAC的测试人员限制写入大多数文件夹,这就是为什么我试图在不下载到光盘的情况下从互联网上显示图片。我还尝试了UAC清单和res文件,它是为“以管理员身份运行”工作的,但不知怎么的,我仍然无法写入程序自己的文件夹。感谢所有帮助,我尝试了该功能,它工作得非常完美,我想再次感谢您的帮助。+1大写字母给代码带来了某种怀旧的turbo pascal感觉。:)@你是说模2还是类似的。TP对case不敏感。