2012-06-16 71 views
0

可能重複:
How to get images from URL in Delphi德爾福 - 顯示圖像,而無需下載

我使用德爾福2010年,有一些功能,我可以在CxImage的下載和顯示JPG或PNG圖片或圖像對象的形式,但我試圖做到沒有下載圖片到硬盤驅動器,我想知道是可能的嗎?我通過谷歌搜索& stackoverflow,但無法找到,所有示例都是關於下載文件。

例如,我在表單中添加了一個cximage1,並希望顯示來自像「http://www.someaddress.com/pictures/001.JPG」這樣的網址的圖片。

感謝所有幫助和抱歉不好英語:)

+0

標準「德爾福」(例如德爾福2010,或RAD開發XE)是一回事 - 它帶有一套非常豐富的庫和控件。 [「cximage」](http://www.xdp.it/cximage/)C++庫有些不同。 DevExpress TcxImage控件還是第三件事。問:你指的是什麼?問:你看過文件嗎? – paulsm4

回答

2

您可以使用此功能(編譯和使用德爾福2010測試),以通過HTTP下載一個文件,並將其存儲在TBitMap。它會讀取已註冊的支持德爾福的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; 
+3

爲什麼DownloadImage返回TBitmap?爲什麼不跳過這一步並返回TGraphic IMG。至少對於這個問題來說,這個轉換步驟似乎相當不必要。 –

+0

謝謝你的功能,我會嘗試,並會盡快讓你知道,所以我試圖避免保存文件光盤,因爲大多數測試人員使用Windows 7和不幸的UAC限制寫入大多數文件夾,這就是爲什麼我試圖在沒有下載到光盤的情況下顯示互聯網上的圖片。我也嘗試了UAC清單和res文件它的工作爲「以管理員身份運行」,但不知何故,我仍然無法寫入程序自己的文件夾。 – Sheshman

+0

感謝所有幫助,我試了一下功能,它的功能完美,我想再次感謝您的幫助。 – Sheshman